2011-08-11 20 views
3

は私が持っている辞書: Dictionary<string, CustomClass> _details = new Dictionary<string, CustomClass>().NET:汎用ディクショナリのソート方法

CustomClass道具をIComparableCompareTo()方法でカスタムソートロジックがあるとして。

すべての私のCustomClassを_details内でソート順にループしたいと思います。

だから私はこのような何かをしたい:

foreach (string value in _details.Values.Sort()) 
{ 

} 

しかしSort()は私のオプションはここにどのようなものがあり、そのタイプに

方法ではないでしょうか?

+2

質問タイトルで*非総称*を意味しましたか? – stakx

+0

キーまたは値でソートしましたか? –

答えて

9

ご質問はやや不明瞭であるが、それを再読にあなたが値ではなくキーで注文したいを表示されます:あなたは値でのみ興味があるならそれも簡単です。その場合には、LINQはOrderBy方法と最善のアプローチです:

foreach (var pair in _details.OrderBy(p => p.Value)) 
{ 
    // Use pair.Key and pair.Value here 
} 

それとも、最初の場所での値たい場合は:あなたが辞書を並べ替えることはできません

foreach (var value in _details.Values.OrderBy(p => p)) 
{ 
    // Use value in here 
} 

を注意-place-Dictionary<,>は基本的に順序付けされていない(またはむしろ、注文は実装の詳細であり、信頼できる方法で変更することはできません)。

のキーで並べ替える場合は、SortedList<,>またはSortedDictionary<,>を使用することをお勧めします。これらの両方は、コレクションをキーで永続的にソートします。

+0

彼はキーではなく値で注文したいと思うようです。しかしおそらく、彼は何かをキーと値と混ぜて、本当に 'CustomClass'をキーにしたいと思っていました。 – CodesInChaos

+1

@CodeInChaos:値で注文するかどうか、または*値*を望むのかどうかは鍵で指示されているかどうかは不明です。編集:おっと、ちょうどCustomClassがIComparableを実装することを見て、おそらくそれは本当に価値です。編集中... –

+0

はいキーではなく値で注文したいです。値をソートされた順序でループしたいと思います。ソートのロジックがたくさんあるので、CustomClassのIComparable.CompareTo()メソッドを使用して並べ替えを行いたいとします。すなわち、OrderByで十分ではありません。 – Bob

8

Linqはすべての列挙型に対してOrderByメソッドを提供しています。各呼び出しごとにコピーが作成され、元のコレクションは変更されません。

コードの部分:string key in _details.Valuesは意味をなさない。 Valuesには、キーではなく値が含まれています。私はあなたがキーの値のペアを繰り返したいと仮定します。つまり、 foreach(_details.OrderBy(ペア=> pair.Value)のvarペア)

ソートに使用した後に値を破棄したい場合は、 a .Select(pair=>pair.Key)

foreach(var value in _details.OrderBy(v=>v)) 
+0

こんにちは。申し訳ありませんが混乱して、私はキーではなく値で注文したい、私は質問のテキストを修正しました。 – Bob

関連する問題