是否有无限重复可枚举的可枚举扩展方法?
例如,给定一个返回的枚举:["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/