2016-04-10 10 views
1

This StackOverflow答えは、HashSetが順序付けされておらず、その項目の列挙順序が定義されておらず、それに依存すべきでないことを完全に記述しています。HashSetは列挙間の順序を保持しますか?

しかし、

これはanouther質問をもたらす:Iべきか、私は2つのsebsequent列挙の間enumeraetion順に頼るべきではないのですか?挿入や削除はありません。

例えば、私はHashSetのにいくつかの項目を追加したと言うことができます:

HashSet<int> set = new HashSet<int>(); 
set.Add(1); 
set.Add(2); 
set.Add(3); 
set.Add(4); 
set.Add(5); 

、私はforeach経由でこのセットを列挙するとき、私たちは、私はこのシーケンスを受信しましょう:

// Result: 1, 3, 4, 5, 2. 

問題は、私が挿入/削除を行わないと、セットを再度列挙しても、その注文は保持されるのでしょうか? いつも同じになりますか?

+5

これが真実であっても、それは文書化されているはずです。そうでないので、私はそれに頼ることはありません。将来のフレームワークの更新でいつでもあなたの顔に壊れてしまう可能性があります。保証された列挙命令が必要な場合は、なぜ地球上でハッシュを使用しますか?それは、あなたの要件を考慮してデータをモデル化するために選択した間違ったデータ構造です。 –

+1

ハッシュセットは基本的に固定スロット順を持つハッシュテーブルなので、セットをまったく変更しなければ反復順序は一定です。あなたはそれに頼るべきですか?いいえ、私はそうは思わない、あなたはそれに頼る必要はありません。 – poke

+0

まあ、私はセットの2つの下位列挙の順序にのみ依存しようとしています、それだけです。私が必要とするデータ構造は、上記の質問に対するO(1)の追加/削除プラスの正解です。何かありますか? – AgentFire

答えて

2

実際に言えば、列挙型の間では常に同じかもしれませんが、IEnumerableの記述では仮定が提供されておらず、実装者は望む順序で返すことを決定できます。

それはボンネットの下に何をしているかを知っている、それが将来的にそれを同じようにやっていきますか。例えば、HashSetの将来の実装は、メモリ不足状態を検出し、その内容をメモリに再配置するように最適化され、返される順序に影響を与える可能性があります。 99.9%の時間で同じ注文が返ってくるでしょうが、メモリリソースが使い尽くされた場合、突然別の順序で物事が返されます。

ボトムラインは、私は時間をかけて一貫性を列挙の順序に依存しませんです。注文が重要な場合は、set.OrderBy(x => x)以上のforeachを実行して、必要な順番になっていることを確認してください。

関連する問題