C# 无限循环的数据结构

C# 无限循环的数据结构,c#,C#,我正在寻找一个可以用项目填充的数据结构,就像IEnumerator调用MoveNext()一样,但是当它到达列表的末尾时,会自动循环回到开始。我可以想出两种方法来实现这一点,或者使用链表并将其链接到自身,或者只编写逻辑来检查IEnumerator.Current是否为null和reset,这两种方法编写起来都很简单,但我想首先检查框架中是否有可以做到这一点的东西 它看起来像这样: public interface IInfiniteEnumerable<T> { bool M

我正在寻找一个可以用项目填充的数据结构,就像IEnumerator调用MoveNext()一样,但是当它到达列表的末尾时,会自动循环回到开始。我可以想出两种方法来实现这一点,或者使用链表并将其链接到自身,或者只编写逻辑来检查IEnumerator.Current是否为null和reset,这两种方法编写起来都很简单,但我想首先检查框架中是否有可以做到这一点的东西

它看起来像这样:

public interface IInfiniteEnumerable<T>
{
    bool MoveNext();

    T Current();
}
公共接口IInfiniteEnumerable
{
bool-MoveNext();
T电流();
}
编辑:根据答案,这会产生以下效果:

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;
            }
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var lst=新列表
{
“A”,
“B”,
“C”
};
IEnumerator枚举器=lst.repeatUnlimited().GetEnumerator();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
枚举数。MoveNext();
Console.WriteLine(枚举器.Current);
Console.ReadLine();
}
}
公共静态类扩展
{
公共静态IEnumerable(此IEnumerable源)
{
while(true)
{
foreach(源中的var项)
{
收益回报项目;
}
}
}
}

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

public static IEnumerable<T> LoopForever<T>(this IEnumerable<T> source)
{
    while (true)
        foreach (var item in source)
            yield return item;
}
公共静态IEnumerable循环永久(此IEnumerable源代码)
{
while(true)
foreach(源中的var项)
收益回报项目;
}

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

public static IEnumerable<T> LoopForever<T>(this IEnumerable<T> source)
{
    while (true)
        foreach (var item in source)
            yield return item;
}
公共静态IEnumerable循环永久(此IEnumerable源代码)
{
while(true)
foreach(源中的var项)
收益回报项目;
}

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

IEnumerator


与IEnumerable不同。

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

IEnumerator


而不是IEnumerable。

为什么需要这样做?一个枚举必须有一个结尾,所以一个无限的枚举打破了这种格式。循环链表,但你必须自己实现它,这并不是那么困难,MoveNext()返回一个bool,而不是void。可能是重复的?@gunr2171“一个枚举必须有一个结尾”为什么?这是作为接口的一部分记录的吗?为什么需要这样做?一个枚举必须有一个结尾,所以一个无限的枚举打破了这种格式。循环链表,但你必须自己实现它,这并不是那么困难,MoveNext()返回一个bool,而不是void。可能是重复的?@gunr2171“一个枚举必须有一个结尾”为什么?这是作为接口的一部分记录的吗?具有讽刺意味的是,ReSharper抱怨您的解决方案可能导致“IEnumerable的可能多次枚举”:)具有讽刺意味的是,ReSharper抱怨您的解决方案可能导致“IEnumerable的可能多次枚举”: