1. ホーム
  2. c#

[解決済み] C#のfor eachループはList<T>をどのような順序で繰り返し処理するのですか?

2023-03-03 07:20:43

質問

C#でforeachループが System.Collections.Generic.List<T> オブジェクトをループする順序についてです。

私が見つけたのは 別の質問 を見つけましたが、私はそれが私の質問に満足のいくように答えているとは感じません。

誰かが順序は定義されないと述べています。しかし、他の誰かが述べるように、配列をトラバースする順序は固定されています (0 から Length-1 まで)。 8.8.4 foreachステートメント

また、順序を持つ標準的なクラスでも同じことが言えるということでした(例えば List<T> ). しかし、それを裏付けるドキュメントを見つけることができません。したがって、私が知っている限りでは、現在はそのように動作するかもしれませんが、次の.NETバージョンでは異なるかもしれません(それはありえないかもしれませんが)。

また、私は List(t).Enumerator のドキュメントも見ましたが、うまくいきませんでした。

別の関連する質問 は、Javaについては、ドキュメントで具体的に言及されていることを述べています。

List.iterator() は、このリスト内の要素に対するイテレータを返します。 を返します。

私はC#のドキュメントでそのようなものを探しています。

よろしくお願いします。

編集:すべての皆さん、回答ありがとうございました(こんなに早くたくさんの返信が来るとは驚きです)。すべての回答から私が理解したことは List<T> は常にそのインデックスの順序で反復するということです。しかし、私はまだ、このことを述べる文書の明確な平和を見たいと思います、同様に に関する Java ドキュメントと同様に List .

どのように解決するのですか?

以下の通りです。 マイクロソフト リファレンス ソース ページ に対して List<T> Enumerator のページでは、0 から Length-1 までの範囲で反復処理を行うことが明示されています。

internal Enumerator(List<T> list) {
    this.list = list;
    index = 0;
    version = list._version;
    current = default(T);
}

public bool MoveNext() {

    List<T> localList = list;

    if (version == localList._version && ((uint)index < (uint)localList._size)) 
    {                                                     
        current = localList._items[index];                    
        index++;
        return true;
    }
    return MoveNextRare();
}

それがまだ誰かにとって適切であることを望む