2008-10-03 15 views

答えて

15

短い回答 - はい。

しかし、コレクションのアイテムの順序は、コレクションのタイプ(たとえば、辞書)によって異なります。

foreachループを使用して、変更されていない単一のコレクションを反復処理するたびに同じ結果が得られます。

+0

こんにちは...私たちの両方が同じことをしたようです。 1つの文章を書いて投稿した後、すぐにそれを編集して詳しく説明します。 –

+0

確かに。 あなたの答えは私よりも適切だと思いますが、OPがそれを決定的なものとしてタグ付けしてくれることを願っています。確かに普及した投票を勝ち取っているようだ:) –

+0

最終的な答えとしてタグ付けすることの問題は、もちろん、正確ではないということです! –

25

コレクションの種類によって異なります。ほとんどのコレクションでは、答えは「はい」です。

ただし、これは保証されません。コレクション型のドキュメントでは、そうするかどうかを指定する必要がありますが、ほとんどの場合、その詳細は一般的に見えます。しかし、それが安定していない場合は、ドキュメントに言及していない場合、それは非常に見落としになります。

0

ほとんどのコレクションでは、これを想定するのが安全だと思います。特定のコレクションが非決定的な方法で実装された列挙子を持つ可能性はありませんが、それはおそらく起きないでしょう...

+0

"おそらく"動作するコードが好きかどうかによって異なります。個人的に私はそれよりも自信がありたい! – MarkJ

6

すべての組み込みコレクションとおそらく答えは「はい」ですがそこには純粋なコレクションクラスがありますが、ドキュメントにはIEnumerableのために制定された制約はありません。したがって、すべての反復が安定していなければならないということはありません。

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9)) 
    Console.WriteLine(i); 

これはよく反復ごとに異なる順序を生成するクラスとして実装されることがあります。

は、私は次のユースケースを想像することができます。

奇妙な境界線のケースも考慮する必要がある場合は、答えは「No」である必要があります。

+0

ええとジェームズは彼の答えを変えましたか?私が私のことを書いたとき、それはまだオリジナルだった。 :/ –

+0

オーダーが一貫しない場合の優れた例! –

3

通常、要素は同じ順序で返されますが、絶対に保証はありません。これは、コレクションクラスの内部実装に完全に依存しています。

たとえば、要素をランダムな順序で返すように特別に設計されたコレクションクラスのケースを見ることができます。

つまり、コレクションクラスの内部実装がわからない限り、には何も指定しないでください。

10

反復処理中のクラスの具体的な実装が分からない限り、これを保証することはできません。

要素の順序が定義されているコレクション(例:List<T>)は、安定した順序で列挙されます。

オブジェクトの状態が変化しないコレクションでは、要素が同じ順序で元に戻る可能性が高くなります。 Dictionary<K,V>ですが、これは仕様によって保証されていません。

これが当てはまらない例として、テーブルをコンパクト化またはサイズ変更するハッシュテーブルベースの辞書実装を想像してみてください。このような実装では、安定した反復順序が保証されません。

1

「改変されていない」(NMの回答) - 辞書のような複雑なコンテナの多くは、順序を保持することを保証していないことに注意してください。アイテムを追加すると、アイテムが最後に表示され(注文が保存されているような印象を与えます)、内部バケットが完全に異なる順序で再構成されることがあります。

SortedList <>などのようなものは、明らかに独自のルールを持っています。

2

Linqは、この目的のためにIOrderedEnumerableインターフェイスを定義しています。

関連する問題