C#无限迭代

时间:2014-11-07 13:45:34

标签: c# .net linq enumerable

C#与Java的Stream.iterate有什么相似之处吗?我能找到的最接近的是Enumerable.Range但它有很大不同。

我问的原因是我一直在观看一些关于良好编程原则的presentation,并且有一个关于声明代码和命令代码的线程。引起我注意的是一种可以生成伪无限数据集的方法。

1 个答案:

答案 0 :(得分:11)

.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语句时,将返回表达式,并保留代码中的当前位置。下次调用迭代器函数时,将从该位置重新开始执行。

来自yield (C# Reference)