给定一个有限的元素列表,我如何创建一个(懒惰评估,谢谢LINQ!)无限列表,只是不断迭代我的初始列表?
如果初始列表为{1, 2, 3}
,我希望新列表返回{1, 2, 3, 1, 2, 3, 1, ...}
答案 0 :(得分:17)
yield return
是一个非常方便的运算符,虽然它并不特别需要LINQ。
IEnumerable<int> GetInfiniteSeries(IEnumerable<int> items) {
while (true) {
foreach (var item in items) {
yield return item;
}
}
}
答案 1 :(得分:6)
IEnumerable<T> Infinite(this IEnumerable<T> ienum)
{
List<T> list = ienum.ToList();
while (true)
foreach(var t in list)
yield return t;
}
foreach(int i in Enumerable.Range(1,3).Infinite())
Console.WriteLine(i);
答案 2 :(得分:3)
以下是我最终的表现:
public static IEnumerable<T> AdNauseam<T>(this IEnumerable<T> i_list)
{
using(var etor = i_list.GetEnumerator())
{
while(true)
{
while(etor.MoveNext())
{
yield return etor.Current;
}
etor.Reset();
}
}
}
用法:
var list = new[] {1, 2, 3}
var infinite = list.AdNauseam().Take(10);
结果:
{1, 2, 3, 1, 2, 3, 1, 2, 3, 1}
答案 3 :(得分:3)
另一种选择,实施IEnumerator<T>
:
public class InfiniteEnumerator<T> : IEnumerator<T>
{
private IList<T> _items;
private int _index = -1;
public InfiniteEnumerator(IList<T> items)
{
if (items == null)
{
throw new ArgumentNullException("items");
}
_items = items;
}
public T Current
{
get { return _items[_index]; }
}
public void Dispose()
{
}
object System.Collections.IEnumerator.Current
{
get { return _items[_index]; }
}
public bool MoveNext()
{
if (_items.Count == 0)
{
return false;
}
_index = (_index + 1) % _items.Count;
return true;
}
public void Reset()
{
_index = -1;
}
}