6回繰り返されます。の場合は1回、。Where
の場合は要素ごとに1回Max
。
これを示すコード:
private static int count = 0;
public static IEnumerable<int> Regurgitate(IEnumerable<int> source)
{
count++;
Console.WriteLine("Iterated sequence {0} times", count);
foreach (int i in source)
yield return i;
}
int[] Numbers = new int[5] { 5, 2, 3, 4, 5 };
IEnumerable<int> sequence = Regurgitate(Numbers);
var query = from a in sequence
where a == sequence.Max(n => n)
select a;
「6回の繰り返しシーケンス」を出力します。
これを使用して他のケースを試すことを計画している場合は、より柔軟な、より汎用的なラッパーを作成できます。
public class EnumerableWrapper<T> : IEnumerable<T>
{
private IEnumerable<T> source;
public EnumerableWrapper(IEnumerable<T> source)
{
this.source = source;
}
public int IterationsStarted { get; private set; }
public int NumMoveNexts { get; private set; }
public int IterationsFinished { get; private set; }
public IEnumerator<T> GetEnumerator()
{
IterationsStarted++;
foreach (T item in source)
{
NumMoveNexts++;
yield return item;
}
IterationsFinished++;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public override string ToString()
{
return string.Format(
@"Iterations Started: {0}
Iterations Finished: {1}
Number of move next calls: {2}"
, IterationsStarted, IterationsFinished, NumMoveNexts);
}
}
これには、他の機能に比べていくつかの利点があります。
- 開始された反復回数、完了した反復回数、およびすべてのシーケンスが増分された合計回数の両方が記録されます。
- さまざまなインスタンスを作成して、さまざまな基になるシーケンスをラップできるため、静的変数を使用する場合に1つだけではなく、プログラムごとに複数のシーケンスを検査できます。