无限循环的数据结构

时间:2014-06-17 19:39:27

标签: c#

我正在寻找一个可以填充项目的数据结构,就像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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:5)

创造它是非常微不足道的。在无限循环内迭代并生成序列中的项:

public static IEnumerable<T> LoopForever<T>(this IEnumerable<T> source)
{
    while (true)
        foreach (var item in source)
            yield return item;
}

答案 1 :(得分:0)

由于Unity3D将其用于并发执行(例如帧更新和协同程序),请尝试

IEnumerator<T>

http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx

而不是IEnumerable。