【问题标题】:C# infinite iterationC# 无限迭代
【发布时间】:2015-01-04 07:53:40
【问题描述】:

C# 中是否有与 Java 的 Stream.iterate 类似的东西?我能找到的最接近的是Enumerable.Range,但它有很大不同。

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

【问题讨论】:

    标签: c# .net linq enumerable


    【解决方案1】:

    .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)

    【讨论】:

    • 其实我并不想写新的扩展方法。
    • @SOReader 然后使用MoreLINQ。
    • 这里应该标记为答案。它提供了一个明确的答案(“不,没有”),同时还提供了 MoreLinq 库中非常常见的替代方案,以及在没有库的情况下实现它的手工代码。
    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2016-09-06
    相关资源
    最近更新 更多