IEnumerableをサポートするコレクションをループする方法は?


回答:


155

それぞれの常連は行います:

foreach (var item in collection)
{
    // do your stuff   
}

これは.ElementAt()よりも高速です。残念ながら、私の投票はAlexaの回答に固定されているため、元に戻すことはできませんが、これが最良の回答です。+1
Leo Gurdian 2016年

では、「IEnumerableの複数の列挙の可能性」をどのように修正しますか?
SharpC

1
@SharpC:最も簡単な方法は、結果をList <T>または配列に引き出し、それを反復処理する必要のあるさまざまな場所に渡すことです。これにより、結果の(潜在的に高価な)列挙が1回だけ行われることが保証されますが、結果はメモリに保存されます。私の最初のステップは、複数の列挙が実際に問題であるかどうかを確認することです。
フレドリックモルク

94

foreachループを使用するためのすでに提案されているメソッドに加えて、実装するオブジェクトIEnumerableもメソッドをIEnumerator介してインターフェイスを提供することにも言及したいと思いましたGetEnumerator。このメソッドは通常は必要ありませんが、コレクションを手動で反復するために使用でき、コレクションの独自の拡張メソッドを作成する場合に特に役立ちます。

IEnumerable<T> mySequence;
using (var sequenceEnum = mySequence.GetEnumerator())
{
    while (sequenceEnum.MoveNext())
    {
        // Do something with sequenceEnum.Current.
    }
}

代表的な例は、2つのシーケンスを同時に反復する場合ですforeach。これは、ループでは不可能です。


7
列挙子を破棄することを忘れないでください。
Eric Lippert

@エリック:うん、見逃しやすいので追加します。
ノルドール2009年

1
これはIEnumerable <T>オブジェクトに対してのみ機能し、IEnumerableに対しては機能しないと思います。IEnumerableにキャストする必要がある一般的なケースがあったため、GetEnumeratorメソッドを使用できませんでした。とにかくほとんどの場合にいい。
ファビオミルヘイロ2015年

50

または非常に古典的な昔ながらの方法ですら

IEnumerable<string> collection = new List<string>() { "a", "b", "c" };

for(int i = 0; i < collection.Count(); i++) 
{
    string str1 = collection.ElementAt(i);
    // do your stuff   
}

多分あなたはこの方法も望むでしょう:-)


9
なぜこれほど多くの賛成票があるのですか?これにより、列挙可能な1回ではなく2n回が列挙されます。
ロマンライナー2016年

1
@RomanReinerこれが機能するため、パフォーマンスを気にしない人もいます:)
Khateeb321 2016年

@RomanReinerこれは良い例です。あるコレクションの各要素を別のコレクションに割り当てる必要があります
。foreach

1
ElementAtの実装を見ると、コレクションがIListの場合、[]を使用してインデックスの要素を返すことがわかります。ただし、[]と同じパフォーマンス。そうでない場合は、列挙子を取得し、要素を返す前に要素を順番に探して反復を開始するため、基本的に各要素に対して新しい列挙子を作成し、リストを再度ナビゲートします...
イスラエルガルシア

1
それよりも悪いことに、IEnumerableはCount()またはElementAt()をサポートしていません。彼はIListを考えていると思います。これは実際には質問にまったく答えません。
krowe


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.