是否存在无限重复可枚举的可枚举扩展方法?
例如,给定一个返回的枚举:[“a”,“b”,“c”]。我想要一个返回无限重复序列的方法 ["a", "b", "c", "a", "b", "c", "a", "b", "c" ... ]
这听起来有点像可观察.重复 http://msdn.microsoft.com/en-us/library/hh229428%28v=vs.103%29.aspx,但我想对 IEnumerables 进行操作。
可枚举.重复 http://msdn.microsoft.com/en-us/library/vstudio/bb348899%28v=vs.100%29.aspx仅从单个元素生成可枚举。
我不知道 LINQ 中内置了什么,但它是really轻松创建自己的:
public static IEnumerable<T> RepeatIndefinitely<T>(this IEnumerable<T> source)
{
while (true)
{
foreach (var item in source)
{
yield return item;
}
}
}
请注意,这评估source
多次——你might想让它只执行一次,创建一个副本:
public static IEnumerable<T> RepeatIndefinitely<T>(this IEnumerable<T> source)
{
var list = source.ToList();
while (true)
{
foreach (var item in list)
{
yield return item;
}
}
}
Notes:
- 创建序列的副本意味着可以自由修改原始序列,而不必担心此代码同时对其进行迭代。
- 当然,创建序列的副本意味着它需要足够小才能适合内存。这可能并不理想。
- 这只会在您开始迭代结果时创建一个副本。这很容易令人惊讶。另一种方法是使用非迭代器方法创建副本,然后委托给私有迭代器方法。这是 LINQ 中用于参数验证的方法。
- 复制是浅的 - 如果源是一个序列
StringBuilder
例如,引用,那么对对象本身的任何更改仍然可见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)