我可以使用无限范围并对其进行操作吗?

suh*_*air 8 c# linq

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中).