Enumerable.Range(0, int.MaxValue)
.Select(n => Math.Pow(n, 2))
.Where(squared => squared % 2 != 0)
.TakeWhile(squared => squared < 10000).Sum()
这段代码会遍历从 0 到最大范围的所有整数值,还是只遍历整数值以满足 take-while、where 和 select 运算符? 有人可以澄清一下吗?
编辑:我第一次尝试确保它按预期工作是愚蠢的。我撤销它:)
最佳答案
int.MaxValue + 5
溢出为负数。自己试试:
unchecked
{
int count = int.MaxValue + 5;
Console.WriteLine(count); // Prints -2147483644
}
Enumerable.Range
的第二个参数必须是非负数 - 因此异常(exception)。
不过,您当然可以在 LINQ 中使用无限序列。以下是此类序列的示例:
public IEnumerable<int> InfiniteCounter()
{
int counter = 0;
while (true)
{
unchecked
{
yield return counter;
counter++;
}
}
}
当然,它也会溢出,但它会继续...
请注意,一些 LINQ 运算符(例如Reverse
)需要读取所有 数据才能产生第一个结果。其他人(如 Select
)可以在从输入中读取结果时保持流式处理结果。看我的Edulinq blog posts有关每个运算符的行为的详细信息(在 LINQ to Objects 中)。
关于c# - 我可以使用无限范围并对其进行操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443939/