同じコレクションに対する2回の反復で、オブジェクトが同じ順序で返されると想定しても安全ですか?明らかに、コレクションは他の方法で変更されていないことを前提としています。
8 に答える
コレクションの種類によって異なります。ほとんどのコレクションでは、答えは「はい」です。
ただし、これは保証されません。コレクションタイプのドキュメントでは、そうするかどうかを指定する必要がありますが、ほとんどの場合、その詳細は一般的に見過ごされています。しかし、それが安定していない場合、ドキュメントがそれについて言及していなければ、それは途方もない見落としになるでしょう。
簡単な答え-はい。
ただし、コレクションのタイプ(辞書など)によっては、コレクション内のアイテムの順序が挿入されたとおりに正確でない場合があることは明らかです。
ただし、foreachループを使用して、変更されていない単一のコレクションを反復処理するたびに、同じ結果が得られます。
繰り返し処理しているクラスの具体的な実装を知らない限り、これを保証することはできません。
要素の順序が定義されているコレクション(例List<T>
)は、安定した順序で列挙されます。
オブジェクトの状態が変化しないコレクションの場合、要素が同じ順序で戻る可能性が高くなります。たとえばDictionary<K,V>
、これは仕様によって保証されていません。
これが当てはまらない例として、テーブルを非同期的に圧縮またはサイズ変更するハッシュテーブルベースのディクショナリ実装を想像できます。このような実装は、安定した反復順序を保証するものではありません。
答えは、すべての組み込みコレクションとおそらくそこにあるすべての正常なコレクションクラスに対して「はい」ですが、ドキュメントには、のために定式化された制約はありませんIEnumerable
。したがって、すべての反復が安定している必要があることを示すものは何もありません。
次のユースケースを想像できます。
foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9))
Console.WriteLine(i);
これは、反復ごとに異なる順序を生成するクラスとして実装される可能性があります。
したがって、奇妙な境界のケースも検討したい場合、答えは「<strong>いいえ」である必要があります。
通常、要素は同じ順序で返されますが、保証はまったくありません。これは、コレクションクラスの内部実装に完全に依存しています。
たとえば、ランダムな順序で要素を返すように特別に設計されたコレクションクラスのケースを見ることができます。
つまり、コレクションクラスの内部実装を知らない限り、順序については何も想定しないでください。
Linqは、この目的のためにIOrderedEnumerableインターフェイスを定義します。
「変更されていない」(NMの応答)-辞書のような多くの複雑なコンテナは、順序を維持することを保証しないことに注意してください。アイテムを追加すると、最後に表示される場合があり(順序が保持されているという印象を与える)、内部バケットが再編成されて完全に異なる順序になる場合があります。
SortedList <、>などには、明らかに独自のルールがあります。
ほとんどのコレクションでは、これを想定するのが安全だと思います。特定のコレクションに非決定論的な方法で列挙子を実装できる可能性の領域を超えていませんが、それはおそらく起こらないでしょう...