C# foreach循环中的无限IEnumerable
回答完之后,为了好玩,我整理了以下C#代码: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; } }
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);
}