c# - 无限期地重复可枚举

标签 c# linq

是否有无限重复可枚举的可枚举扩展方法?

例如,给定一个返回的枚举:["a", "b", "c"]。我想要一个返回无限重复序列的方法 ["a", "b", "c", "a", "b", "c", "a", "b", "c"... ]

这听起来有点像 Observable.Repeat ,除了我想对 IEnumerables 进行操作。

Enumerable.Repeat仅从单个元素生成枚举。

最佳答案

我不知道 LINQ 中内置了什么,但是真的可以很容易地创建自己的东西:

public static IEnumerable<T> RepeatIndefinitely<T>(this IEnumerable<T> source)
{
    while (true)
    {
        foreach (var item in source)
        {
            yield return item;
        }
    }
}

请注意,这会多次计算 source - 您可能希望让它只执行一次,创建一个副本:

public static IEnumerable<T> RepeatIndefinitely<T>(this IEnumerable<T> source)
{
    var list = source.ToList();
    while (true)
    {
        foreach (var item in list)
        {
            yield return item;
        }
    }
}

注意事项:

  • 创建序列的副本意味着可以自由修改原始序列,而不必担心此代码会同时迭代它。
  • 当然,创建序列的副本意味着它需要足够小以适合内存。这可能并不理想。
  • 这只会在您开始迭代结果时创建一个副本。这很容易令人惊讶。另一种方法是使用创建副本的非迭代器方法,然后委托(delegate)给私有(private)迭代器方法。这是 LINQ 中用于参数验证的方法。
  • 副本很浅 - 例如,如果源是一系列 StringBuilder 引用,那么对对象本身的任何更改仍然可见。

关于c# - 无限期地重复可枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24181656/

相关文章:

c# - 如何在 IL 代码中发出三元运算符

c# - 如何在.Net 5项目中将Sentry连接到NLog

c# - 使用流保存 xml 文件会导致重复的根元素

c# - 传递 Func<TSource, TKey> keySelector 错误

c# - 使用 C# 在 SQL Server 的临时表中插入 30,000 行的最快方法

javascript - 是否有访问 JSON.parse XMLHTTPRequest.responseText 的通用方法?

c# - Linq:确定序列中的项目数是否满足条件

c# - 为什么 IEnumerable<T> 没有 FindAll 或 RemoveAll 方法?

c# - 是否有更简洁的方法使用 LINQ 将项目添加到集合属性?

c# - 如何从资源项目中获取图像