gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:52:08 25 4
gpt4 key购买 nike

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

例如,给定一个返回的枚举:["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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com