在foreach循环中无限IEnumerable

Joe*_*orn 5 c# linq yield

回答完这个问题之后,我把以下的C#代码放在一起只是为了好玩:

public static IEnumerable<int> FibonacciTo(int max)
{     
    int m1 = 0;
    int m2 = 1;
    int r = 1;

    while (r <= max)
    {
       yield return r;

       r = m1 + m2;
       m1 = m2;
       m2 = r;
    }
}

foreach (int i in FibonacciTo(56).Where(n => n >= 24) )
{
   Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)

问题是我不喜欢需要将max参数传递给函数.现在,如果我不使用一个代码将输出正确的数据,但随后IEnumerable继续工作时似乎挂起.我该如何写这个,以便我可以像这样使用它:

foreach (int i in Fibonacci().Where(n => n >= 24 && n <= 56) )
{
   Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

您需要使用的组合SkipWhileTakeWhile替代.

foreach (int i in Fibonacci().SkipWhile(n => n < 24)
                             .TakeWhile(n => n <= 56))
{
   Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)

这些能够根据条件结束循环; Where流输入它(适当地过滤)直到输入用完(在你的情况下,永远不会).