2009-03-04 10 views
14

同僚はforループを使用して、リストを繰り返し、コメントを残しました。「For Eachは、順番に反復するかどうかわからなかったので使用しませんでした。たとえば、私たちはこのように構築リストがあるとします。私は、彼は恐れてだと思う.NET foreachステートメントは、コレクションが作成されたのと同じ順序でコレクションを反復処理することが保証されていますか?

foreach (var item in someList)    
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

for (int i = 0; i < someList.Count; i++)  
{ 
    System.Diagnostics.Debug.WriteLine(someList[i]); 
} 

の代わりに、この:

var someList = new List<string>(); 

someList.Add("one"); 
someList.Add("two"); 
someList.Add("three"); 

私の同僚は、このようなものを使用しましたアイテムがコレクションに追加された順序とは異なる順序で出現する可能性があります。私は彼が少し編集的だと思うが、技術的には、ドキュメンテーションはコレクションが繰り返される順序を述べていない。 foreach文が、配列またはコレクションオブジェクトを、最低限のものから最高のもの以外の順序でトラバースすることは可能ですか?

答えて

33

あなたの質問はList<T>に関するもので、注文を維持しています。

foreachは単独では何もすることを保証していません。列挙子のために提供されたオブジェクトを尋ねるだけで、何かを行う可能性があります。

+3

+1いいえ、Skeetエフェクトは投票数が少なくなっています。 –

+0

私がSkeetエフェクトを克服することができるかどうかをテストします。指が交差した。 –

+4

あなたは自分のupvoteのために私よりも1つ多く持っています。あなたが意味するSkeet効果ではないと思います; –

22

これは、コレクションに依存します。

  • List<T>にとっては挿入順序であることが保証されます。 (これは、図のようにAddの呼び出しがあると仮定しています。特定の場所で要素をリストに挿入すると、予想通りに戻ります)list[0]list[1]と基本的に同じ順序です、list[2]など
  • Dictionary<TKey, TValue>の場合、保証された発注はありません。
  • SortedList<TKey, TValue>(など)の場合、キーの比較順序になります。これがそのタイプのポイントです。
  • 配列は常に要素の順序で出現します。
+0

あなたは正しいが、私はまだforeachがコレクション内のすべてのオブジェクトを反復処理するためのものであり、順序を保証するものではありません。 foreachが選択する順序を決定するのはコレクションの実装に依存します。したがって、foreachを使用すると保証された動作はありません。 – DevinB

+1

@devinbそれは、@ジョンが言っていることのようなものだと思います。 –

+2

foreachはコレクションからGetEnumeratorを使用することが保証されています。コレクションのイテレータの順序を知っていれば、foreachから同じ順序が保証されます。たとえば、Listを順番に反復処理することに頼ることは、まったく合理的です。 –

4

具体的に質問に答えるために、 "foreach"は。 GetEnumerator()が返されます。リストの場合は、最後に追加した順序です。辞書の場合、おそらく物事が割り当てられたバケツの順番です。