【发布时间】:2014-06-18 04:45:16
【问题描述】:
我正在寻找一个可以填充项目的数据结构,就像一个 IEnumerator 调用 MoveNext() 但是当它到达列表的末尾时会自动循环回到开头。我可以想到两种方法来做到这一点,要么使用链表并将其链接到自身,要么只编写逻辑来检查 IEnumerator.Current 是否为空并重置,这两种方法都相当简单,但我想先检查是否有是框架中已经可以做到这一点的东西。
看起来像这样:
public interface IInfiniteEnumerable<T>
{
bool MoveNext();
T Current();
}
编辑:根据答案,这可以解决问题:
class Program
{
static void Main(string[] args)
{
var lst = new List<string>
{
"A",
"B",
"C"
};
IEnumerator<string> enumerator = lst.RepeatIndefinitely().GetEnumerator();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
Console.ReadLine();
}
}
public static class Extensions
{
public static IEnumerable<T> RepeatIndefinitely<T>(this IEnumerable<T> source)
{
while (true)
{
foreach (var item in source)
{
yield return item;
}
}
}
}
【问题讨论】:
-
为什么需要这样做?而且 Enumerable 必须有结尾,所以 Infinite Enumerable 打破了这种格式。
-
循环链表,不过得自己实现,没那么难
-
顺便说一句,MoveNext() 返回一个布尔值,而不是 void。
-
@gunr2171 "一个可枚举的对象必须有一个结尾" 为什么?这是否记录为界面的一部分?
标签: c#