web-dev-qa-db-ja.com

foreachを使用して最初の要素以外の要素から反復を開始することは可能ですか?

カスタムコレクション(ツリー)にIEnumerableを実装することを考えているので、foreachを使用してツリーをトラバースできます。しかし、私が知る限り、foreachは常にコレクションの最初の要素から始まります。 foreachが開始する要素から選択したいと思います。 foreachの開始元の要素を何らかの方法で変更することは可能ですか?

74
inferno

はい。以下をせよ:

Collection<string> myCollection = new Collection<string>;

foreach (string curString in myCollection.Skip(3))
    //Dostuff

SkipはIEnumerable関数であり、現在のインデックスから指定した多くの値をスキップします。一方、only最初の3つを使用する場合は、.Takeを使用します。

foreach (string curString in myCollection.Take(3))

これらはペアにすることもできるので、4-6個のアイテムだけが必要な場合は、次のようにします。

foreach (string curString in myCollection.Skip(3).Take(3))
137
MoarCodePlz

このためには、LINQ to Objectsで Skip メソッドを使用して、指定された数の要素をスキップするのが最も簡単です。

foreach (var value in sequence.Skip(1)) // Skips just one value
{
    ...
}

明らかに、他の値の1を変更して、異なる数の要素をスキップします...

同様に、 Take を使用して、返される要素の数を制限できます。

my Edulinq blog series で、これら(および関連するSkipWhileおよびTakeWhileメソッド)の両方について詳しく読むことができます。

19
Jon Skeet

Enumerable.Skip を使用して一部の要素をスキップし、そこから開始できます。

例えば:

foreach(item in theTree.Skip(9))  // Skips the first 9 items
{
    // Do something

ただし、ツリーを記述している場合は、ツリーアイテム自体に、そこから列挙する新しいIEnumerable<T>を返すメンバーを提供することができます。これは、長期的にはより有用になる可能性があります。

5
Reed Copsey