15

ある同僚は、for ループを使用して、自分が作成した C# コードで List を反復処理し、「For Each を使用しなかったのは、それが順番に反復されるかどうか確信が持てなかったからです。Microsoft が何をするかは誰にもわかりません。」とコメントを残しました。たとえば、次のように構築された List があるとします。

var someList = new List<string>();

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

私の同僚は次のようなものを使用しました:

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

これの代わりに:

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

コレクションに追加された順序とは異なる順序でアイテムが表示されるのではないかと心配しているようです。彼は少し偏執的だと思いますが、技術的には、ドキュメントにはコレクションが反復される順序が記載されていません。foreach ステートメントが配列またはコレクション オブジェクトを、下限から上限以外の任意の順序でトラバースすることは可能ですか?

4

3 に答える 3

33

あなたの質問は、List<T>秩序を維持する に関するものです。

foreach だけでは、何もできないことが保証されています。列挙子に提供されたオブジェクトを要求するだけで、何でもできる可能性があります。

于 2009-03-04T21:25:01.240 に答える
23

コレクションによって異なります。

  • 広告List<T>掲載順であることが保証されているからです。(これは、示されているように呼び出しを想定してAddいます。リストの特定の場所に要素を挿入すると、期待どおりに正しい位置に要素が返されます。)基本的にlist[0]list[1]list[2]などを取得するのと同じ順序です。
  • Dictionary<TKey, TValue>順序が保証されていないためです。
  • for SortedList<TKey, TValue>(など) では、キーの比較順序になります。これが型のポイントです。
  • 配列は常に要素順に出てきます。
于 2009-03-04T21:25:22.160 に答える
4

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

于 2009-03-04T21:28:48.610 に答える