与えられた開始点からランダムな数字のリストを作成するように設計されたプログラムを書きました。それは簡単で汚いものでしたが、それで遊んでいると、よくわからない興味深い効果が見つかりました。
void Main()
{
List<int> foo = new List<int>(){1,2,3};
IEnumerable<int> bar = GetNumbers(foo);
for (int i = 1; i < 3; i++)
{
foo = new List<int>(){1,2,3};
var wibble = GetNumbers(foo);
bar = bar.Concat(wibble);
}
Iterate(bar);
Iterate(bar);
}
public void Iterate(IEnumerable<int> numbers)
{
Console.WriteLine("iterating");
foreach(int number in numbers)
{
Console.WriteLine(number);
}
}
public IEnumerable<int> GetNumbers(List<int> input)
{
//This function originally did more but this is a cutdown version for testing.
while (input.Count>0)
{
int returnvalue = input[0];
input.Remove(input[0]);
yield return returnvalue;
}
}
これを実行した結果は次のとおりです。
iterating
1
2
3
1
2
3
1
2
3
iterating
つまり、bar
空になった直後に 2 回目の繰り返しを行います。
これは、リストを生成するために使用されているリストを初めて空にすることを反復し、その後、空になった同じリストを使用して反復するという事実と関係があると思います。
私の混乱は、なぜこれが起こっているのですか?IEnumerables を列挙するたびに既定の状態から開始されないのはなぜですか? 誰かが私がここで何をしているのか正確に説明できますか?
.ToList()
明確にするために、呼び出しに を追加することでこの問題を解決できることを知っていGetNumbers()
ます。これにより、結果の即時評価と保存が強制されます。