【发布时间】:2022-01-14 03:22:13
【问题描述】:
我用 IEnumerable 得到序列号 0 ~ 2,当我打印结果时。 IEnumerable 和 IEnumerable.ToList() 的结果是不同的。
void Main()
{
var numbers = GetNumbers();
Print(numbers);
/*
Return: 0
Print: 0
Return: 1
Print: 1
Return: 2
Print: 2
Return: 0
Return: 1
Return: 2
Total: 3
*/
Print(numbers.ToList());
/*
Return: 0
Return: 1
Return: 2
Print: 0
Print: 1
Print: 2
Total: 3
*/
}
void Print(IEnumerable<int> numbers) {
foreach(var number in numbers)
{
Console.WriteLine($"Print: {number}");
}
Console.WriteLine($"Total: {numbers.Count()}");
}
IEnumerable<int> GetNumbers()
{
return Enumerable.Range(0, 3)
.Select(n =>
{
Console.WriteLine($"Return: {n}");
return n;
});
}
执行IEnumerable.Count()时,似乎纯IEnumerable linq Select函数被调用了两次。
这是怎么回事?
【问题讨论】:
-
枚举被枚举多次(每次循环),这通过枚举(选择)的源中的副作用注意到。这在其他情况下也可能有问题,例如返回 Guid.NewGuid 值。
标签: c# list linq ienumerable