Enumerable.Range(0, int.MaxValue)
.Select(n => Math.Pow(n, 2))
.Where(squared => squared % 2 != 0)
.TakeWhile(squared => squared < 10000).Sum()
Run Code Online (Sandbox Code Playgroud)
此代码是否会迭代从0到最大范围的所有整数值,或者仅通过整数值来满足take-while,where和select运算符?有人可以澄清一下吗?
编辑:我第一次尝试确保它按预期工作是愚蠢的.我撤销它:)
Jon*_*eet 11
int.MaxValue + 5溢出为负数.亲自尝试一下:
unchecked
{
int count = int.MaxValue + 5;
Console.WriteLine(count); // Prints -2147483644
}
Run Code Online (Sandbox Code Playgroud)
第二个论点Enumerable.Range必须是非负的 - 因此是例外.
你当然可以在LINQ中使用无限序列.这是一个这样的序列的例子:
public IEnumerable<int> InfiniteCounter()
{
int counter = 0;
while (true)
{
unchecked
{
yield return counter;
counter++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,那也会溢出,但它会继续......
请注意,某些 LINQ运算符(例如Reverse)需要先读取所有数据才能产生第一个结果.其他人(比如Select)可以保持流式搜索结果,因为他们从输入中读取结果.有关每个运算符行为的详细信息,请参阅我的Edulinq博客文章(在LINQ to Objects中).