linqGetEnumerator()
での使用は何ですか。
基本的な例でそれがどのように機能するかを誰かに説明してもらえますか?
前もって感謝します。
GetEnumerator()は、コレクションを反復処理するために使用できるオブジェクトを返します。
次の数字のリストがあるとします。
var numbers = new List<Int32>() {1, 2, 3, 4, 5};
すべての偶数を文字列に変換したい場合は、次のメソッドを記述できます。
IEnumerable<string> GetEvenStrings(IEnumerable<Int32> source)
{
using (var enumerator = source.GetEnumerator())
while (enumerator.MoveNext())
if (enumerator.Current % 2 == 0)
yield return enumerator.Current.ToString();
}
MoveNextメソッドは、コレクション内の次の要素へのポイントの Current プロパティを持ち、要素が残っていない場合 (そうでない場合)Enumerator
に戻ります。false
true
これは、列挙子の使用方法の非常に基本的な例です。より複雑で実用的な使用法は、たとえば次のメソッドの実装です。Zip
private static IEnumerable<TResult> ZipImpl<TFirst, TSecond, TResult>(
IEnumerable<TFirst> first,
IEnumerable<TSecond> second,
Func<TFirst, TSecond, TResult> resultSelector)
{
using (IEnumerator<TFirst> iterator1 = first.GetEnumerator())
using (IEnumerator<TSecond> iterator2 = second.GetEnumerator())
{
while (iterator1.MoveNext() && iterator2.MoveNext())
{
yield return resultSelector(iterator1.Current, iterator2.Current);
}
}
}
(このコードは、Jon Skeet のEdulinq プロジェクトからのもので、強くお勧めします)
この例では、Enumerator
を使用して 2 つのコレクションを同時に反復処理し、結果として 1 つのコレクションになります。
一般に、Enumerator
コレクションを段階的に繰り返し処理してロジックを適用したいが、最初にコレクション全体を消費したくない場合は、 を使用することができます。これは、コレクションがdefered executionを使用している可能性があるためです。