C# foreach循环中的无限IEnumerable

C# foreach循环中的无限IEnumerable,c#,linq,yield,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; } }

回答完之后,为了好玩,我整理了以下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);
}

我认为这是不可能的,除非您编写自己的LINQ提供程序。在您给出的示例中,您使用的是LINQ to对象,在IEnumerable对其应用筛选器之前,需要对其进行完全求值。

您需要使用
SkipWhile
TakeWhile
的组合

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

.TakeWhile(n=>n我刚刚发现了这一点,并打算自己发布。奇怪的是,最终写出的问题有时会让你想到显而易见的问题……我的基本问题是,我只专注于在一个lambda表达式中执行此操作。现在我还想写一个新的“SkipThenTakeWhile()”IEnumerable扩展允许这样做,只要我能想出一个更好的名称;)虽然我也喜欢编写LINQ操作符,但我会质疑这是否经常出现,值得一提;)谢天谢地,IEnumerable并不是这样工作的:它在求值时应用过滤器,因此数据流化而不是重复。Joel你是对的,我忘记了函数编程的基本原理,在函数编程中操作不会产生副作用。
foreach (int i in Fibonacci().SkipWhile(n => n < 24)
                             .TakeWhile(n => n <= 56))
{
   Console.WriteLine(i);
}