5

回答完这个问题后,我将以下 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);
}

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

foreach (int i in Fibonacci().Where(n => n >= 24 && n <= 56) )
{
   Console.WriteLine(i);
}
4

2 回答 2

12

您需要使用 and 的组合来SkipWhile代替TakeWhile

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

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

于 2009-05-05T19:49:02.840 回答
-2

除非您编写自己的 LINQ 提供程序,否则我认为这是不可能的。在您提供的示例中,您使用的是 LINQ to Objects,它需要完全评估 IEnumerable,然后才能对其应用过滤器。

于 2009-05-05T19:48:03.843 回答