【问题标题】:Data structure for infinite loop无限循环的数据结构
【发布时间】: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。
  • 可能是stackoverflow.com/questions/24181656 的副本?
  • @gunr2171 "一个可枚举的对象必须有一个结尾" 为什么?这是否记录为界面的一部分?

标签: c#


【解决方案1】:

创建起来非常简单。在无限循环内按顺序迭代并生成项目:

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

【讨论】:

  • 具有讽刺意味的是,ReSharper 抱怨您的解决方案可能会导致“IEnumerable 的可能多重枚举”:)
【解决方案2】:

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

IEnumerator&lt;T&gt;

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

而不是 IEnumerable。

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2019-02-04
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多