【发布时间】:2015-01-04 07:53:40
【问题描述】:
C# 中是否有与 Java 的 Stream.iterate 类似的东西?我能找到的最接近的是Enumerable.Range,但它有很大不同。
我问的原因是我一直在看一些 presentation 关于好的编程原则,并且有一个关于声明式与命令式代码的线程。引起我注意的是一种生成伪无限数据集的方法。
【问题讨论】:
标签: c# .net linq enumerable
C# 中是否有与 Java 的 Stream.iterate 类似的东西?我能找到的最接近的是Enumerable.Range,但它有很大不同。
我问的原因是我一直在看一些 presentation 关于好的编程原则,并且有一个关于声明式与命令式代码的线程。引起我注意的是一种生成伪无限数据集的方法。
【问题讨论】:
标签: c# .net linq enumerable
.Net 框架中没有完全等价的,但MoreLINQ library 中有一个:
foreach (var current in MoreEnumerable.Generate(5, n => n + 2).Take(10))
{
Console.WriteLine(current);
}
使用yield重新创建它也非常简单:
public static IEnumerable<T> Iterate<T>(T seed, Func<T,T> unaryOperator)
{
while (true)
{
yield return seed;
seed = unaryOperator(seed);
}
}
yield 能够创建无限枚举器,因为:
在迭代器方法中到达yield return语句时,返回表达式,并保留代码中的当前位置。下次调用迭代器函数时,将从该位置重新开始执行。
【讨论】:
MoreLinq 库中非常常见的替代方案,以及在没有库的情况下实现它的手工代码。