2012-02-14 13 views
5

内部の+値は、我々が何をしたいリストをソート

var dictionary= new Dictionary<int, IList<int>>(); 

を持っていると仮定して、キーで辞書 >はそれのソートされたバージョンをouputをすることで、内部の値によって、その後キーで最初とを命じましたリスト。

など。

1 2, 1, 6 
5 2, 1 
2 1, 3 

1 1, 2, 6 
2 1, 3 
5 1, 2 

になり、私はforeachの内側にそれをやってみましたが、明らかにこれはあなたが反復されているものを変更することは悪い考えです。

+1

"ソートされたバージョンを取得したい" - _how_あなたはそれを望みますか?出力として、または新しいコレクションとして? –

+0

質問を編集しました –

答えて

10

はこれを試してみてください:

// Creating test data 
    var dictionary = new Dictionary<int, IList<int>> 
    { 
     { 1, new List<int> { 2, 1, 6 } }, 
     { 5, new List<int> { 2, 1 } }, 
     { 2, new List<int> { 2, 3 } } 
    }; 

    // Ordering as requested 
    dictionary = dictionary 
     .OrderBy(d => d.Key) 
     .ToDictionary(
      d => d.Key, 
      d => (IList<int>)d.Value.OrderBy(v => v).ToList() 
     ); 

    // Displaying the results 
    foreach(var kv in dictionary) 
    { 
     Console.Write("\n{0}", kv.Key); 
     foreach (var li in kv.Value) 
     { 
      Console.Write("\t{0}", li); 
     } 
    } 
+0

これは2つの理由で間違っています。 1つは、それらを辞書に戻すことによって、あなたは再び彼の優先順位を損なうことになります。 2つ目は、 'IOrderedEnumerable 'を 'IList 'にキャストできません。 – nawfal

+0

本当にToListコールが欠落していました。しかし、注文は維持されます。 – Schiavini

+0

しかし、最後に 'ToDictionary'を呼び出すことで、アイテムを順序付けられていないコレクションに戻しています。 「働く」部分は偶然であり、文書化されていない。実装が変更される可能性があります。覚えておくべきことは**辞書は定義上順序付けされていないコレクション**です。 [参照](http://stackoverflow.com/questions/1453190/does-the-enumerator-of-a-dictionarytkey-tvalue-return-key-value-pairs-in-the) – nawfal

3

Dictionaryはソートされていません。辞書を並べ替えるには、OrderedDictionaryを使用します。リストをソートする

、あなたは辞書項目をList<T>.OrderBy()

+0

これは、キー部分のみのソートを解決するでしょうか? –

+1

-1:質問には答えられません。もう一度お読みください。 OPはディクショナリをソートしたくない、ソートされたものだけを出力したいだけです。 – leppie

+0

@leppieもう一度読んだ。それでも、OPは明示的に彼/彼女は "それのソート版"を望んでいると言います。辞書のソートされたバージョンは、まあ、行くと推測されます。とにかくdownvoteありがとう。 –

0

することができますループを使用して、別々に各リストを並べ替えることができます。これは次のようになります:

SortDictionary(dictionary);その後

foreach (System.Collections.Generic.KeyValuePair<int,IList<int>> list in dictionary) 
     { 
      SortDictionary(list.Value) 
     } 
3

あなたは、このような辞書の内容を注文するためにLINQを使用することができます。これは、もちろん

 var dictionary = new Dictionary<int, IList<int>>(); 
     var orderedItems = dictionary 
           .OrderBy(pair => pair.Key) 
           .Select(new { 
             Key = pair.Key, 
             Value = pair.Value.OrderBy(i => i)}); 

をむしろ醜い。この時点で、より良いオプションは、リストや配列として結果のIEnumerableを使用する必要がある場合は、ToListメソッドまたはてToArrayを使用して作成することができますLINQの構文に

  var orderedItems =from pair in dictionary 
        orderby pair.Key 
        let values = pair.Value.OrderBy(i => i) 
        select new { Key = pair.Key, Value = values }; 

を使用することです。しかし、ほとんどの場合、IEnumerableをそのまま使用することができます

+0

FAIL!辞書に行くと、注文は失われます。 – leppie

+0

このコードを作業コードから直接コピーしました。今すぐ変更する –

+0

明らかに、動作していません:p – leppie

関連する問題