2012-03-22 1 views
5

私の同僚がチェックインいくつかのコードを見ていた私は、それはこのように見えた:Dictionaryは、ハッシュテーブルであるので、私はすぐに非、彼のコードが間違っていると私の同僚に語った.Net辞書がソートされているように見えるのはなぜですか?

return list.OrderBy(item => item.Order).ToDictionary(item => item.Id); 

ソートされたコレクション。彼は、注文保存コレクションを使用するか、あとでアイテムを並べ替えて、foreachという辞書から読み込んでください。

しかし、彼は答えました。「いいえ、いいえ、私のコードは正しいです。見てください:OrderByを追加したので、項目は正しい順序で表示されます。

テストケースでは、彼が正しいと分かりました。他のデータを試しましたが、まだ完全にソートされています!

私は、この行動に頼るべきではないと言いましたが、彼は同意しません。理由を説明するのが難しいです。それに、私はなぜ注文がしばしば保存されているように見えるのかに興味があります。

私の質問は... Dictionaryは基本的にソートされていないコレクションで、ソートされているようですね。

+3

辞書<>コレクションは順不同であるという保証を提供していません。目的に応じてランダムを使用しません。はい、コードが間違っています。 –

+1

はいジャスティン、これは複製です。あなたがリンクしている質問の答えは、私が望むものです。辞書に関する多くの質問の中で、重複をすばやく見つける方法はありますか?私は検索し、それを見つけることができませんでした。ありがとうございました! –

+0

私はこれをコメントとして投稿している理由はわかりませんが、SQLと同じであると思います。 'SELECT'によって返された行は、' ORDER BY'節が含まれていない限り、不特定の順序で返されます。多くの場合、特に小さなデータセットでは、挿入されたのと同じ順序で行が返され、多くの人が移動します。 (私はいつも、結果の順序について気にするならば、「ORDER BY」を含めるように人々に言います。それがなければ働くかもしれませんが、ひどく壊れるかもしれません)。 –

答えて

6

Dictionaryがどのように実装されているか(場合によってはアイテムが順番に追加されるため)、ソートされます。しかし、これは実装の詳細です。

は存在SortedDictionaryクラスは、これは我々が簡単なDictionaryでご注文のアイテムに頼ることができない彼を説得する必要があり、そこには、あなたの同僚に知らせる;)

+0

実装の詳細ですが、私はそれが変わるとは思わない。おそらくAdd() - 辞書だけが順序を保持していると言っても大丈夫です。 –

+0

@EldritchConundrum本当に、あなたはそれを仮定すべきではありません。現在はそうですが、将来のバージョンではそうではないかもしれません。フレームワークの他の実装(Monoなど)について考えてみましょう。彼らがDictionaryを同じように実装したという保証はありません。 – ken2k

+0

はい。もっと重要なのは、私の同僚のコードが失敗するテストケースを構築する方法を知っています;)foreachの前に削除して追加するだけです。 –

3

辞書を反復処理すると、項目がthe order they were inserted to the dictionaryになります。

この例では、リストがソートされ、次に各項目が順番に辞書に追加されます。

最終的に、辞書の項目はリストのソート順になります。

しかし、現在の実装ではこれはちょうどDictionaryの実装で起こります。そのように保たれるという保証はありません。

Dictionaryの項目を特定の順序で使用する必要がある場合は、SortedDictionaryを使用する必要があります。

+0

なぜソートされているのかを説明できますか?私は彼らが "Id"というプロパティであるハッシュによって "命令"されていると言いたいです –

+1

@LuisFilipe - 私は従いません。リストは整理されました( 'list。OrderBy(item => item.Order) 'が' Dictionary'に変換されます。変換は、各項目を辞書に追加することによって機能します。ディクショナリ内の項目は、挿入順であるという点で「順序付け」されています。彼らは順番に_inserted_されていたので、辞書は順調です。 – Oded

+0

これは仕様/契約によって保証されていますか、それとも特定の実装がどのように書かれているかのアーティファクトですか?それが保証された行動であれば、引用が有用であろう。 –

関連する問題