2012-01-14 14 views
9

辞書ではなく、VALUEキーでソートされたソート順で反復処理する方法はありますか? 私は "SortedDictionary"オブジェクトにアクセスしましたが、悲しいことに、キーでソートされています。 私の値を使ってすべてのキーをフリップし、SortedDictionaryに配置することが1つの解決策です(すべて整数なので)。 - しかし、どのようにすればよいか全くわかりません。C#辞書で反復処理する値で並べ替え

+1

はどのくらいの頻度でそれを行う必要がありますか?それはいかに効率的でなければなりませんか?あなたはより速いスピードでメモリを交換したいですか? – svick

+0

これは約500回の結果でしか動作しません。常により大きなスピードのためにメモリを交換して喜んで:D –

答えて

18

キー/値のペアを取り出し、ソートして繰り返します。完了するために

foreach(var pair in dictionary.OrderBy(p => p.Value)) { 
    // work with pair.Key and pair.Value 
} 
+0

ああ、ありがとう! :)それは私が必要とするもののように正確に見えます。このLINQ私は聞いて、それは何ですか? –

+2

@ GeogesOatesLarsen:それはあなたがそれを使用しないことで欠けているものです。あなたは[this](http://msdn.microsoft.com/en-us/library/bb308959.aspx)またはGoogleにそれを読んでほしいかもしれません。 – Jon

0

、カスタムタイプ用(dictionary.OrderByた(p => p.Value)) "しません" 仕事上で示唆コード:LINQを使用してデッド簡単。

OrderByは、2つのオブジェクトを比較できるようにIComparableを使用します。辞書の値がカスタムタイプの場合、が適切な方法で値をソートできるようにIComparableを実装する必要があります。

hereで読んでください。値で//ソート辞書

+0

"IComparableを実装する必要があります" - 必ずしもそうである必要はありません。 OrderBy()には2つのオーバーロードがあります。それらのうちの1つは記述どおりに動作しますが、2つ目はカスタムIComparableオブジェクトを受け入れますので、任意の値型を並べ替えることができます。 – DXM

+0

@DXM、もう一つのオーバーロードはそれほど意味をなさない 'IComparable'ではなく' IComparer'を受け入れます。また、これは値型とは関係がありませんが、どの型に対しても同じように動作します。 – svick

+0

@svick - タイプミスに悪いですが、そうです、それはIComparerですが、OPは何を求めているのでしょうか?独自のcomparerオブジェクトを作成して、必要なものを比較してOrderBy()に渡すことができます。そして、「価値」によって私は価値対参照を意味しませんでした。私は価値対鍵を意味しました。私はcomparerが値型と参照型で動作することを理解しています。この回答に同意すれば、OrderByはIComparableを実装するタイプでしか使用できません。その2番目のオーバーロードが何であるか説明できますか? – DXM

0

foreach (KeyValuePair<datatype, datatype> item in dictionary) 
{ 
//do something by value....accessing item.value 
} 
関連する問題