如何创建循环列表的 GetEnumerator?

how do I create GetEnumerator of my circular list?

我必须创建自己的循环列表,我使用通用的。

首先我创建 Node<D> class 代表数据和下一个元素

      private class Node<D> {
            public D info;
            public Node<D> next;

            public Node() {

            }

            public Node(D p) {
                info = p;
            }
        } 

为了创建循环列表,我创建了 circularList<T> class。此 class 使用 Node<> 作为元素的项目。

这里是CircularList<T>class

class CircularList<T> : IEnumerable<T> {
    public Node<T> start;
    public Node<T> rear;
    public int count = 0;
    public CircularList(T firstItem) {
        start = new Node<T>(firstItem);
        rear = start;
        rear.next = start;
    }

    public void Insert(T newItem) {
        //Inserting code here
    }

    public void Update(T oldItem, T newItem) {
        //Updating code is here
    }

    public void Delete(T theItem) {
        //deleting code is here
    }


}

当我开始使用 foreach

循环时
foreach(string item in CircularList<string>){

}

我收到一条错误消息说 circularlist class 需要 GetEnumerator().

实际上我可以循环我所有的循环列表,但我正在使用 do-while 并且我需要 Node<T> 来开始循环。但我不想使用 Nodedo-while.

如何创建 GetEnumerator()?

感谢任何帮助。 :)

谢谢

:我真的很不明白IEnumerable之类的东西,请不要着急举个例子和解释一下。

您需要从 IEnumerable 实施 GetEnumerator() 方法,foreach 才能工作。

使用如下内容:

public class CircularList<T> : IEnumerable<T>
{
    private List<T> mylist = new List<T>();

    public T this[int index]
    {
        get
        {
            return this.mylist[index];
        }
        set
        {
            this.mylist.Insert(index, value);
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        return this.mylist.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

mylist 维护 T 类型的列表,您将 insertupdatedelete.

编辑

myList 只是 "custom" 列表的后备存储。只要您正确实现了底层功能,myList 就可以是数组、数组列表等。 为简单起见,我在这里使用了 List<T>,它已经实现了接口 IEnumerable<T>IEnumerator<T>(注意 IEnumera**tor** 而不是 IEnumerable)。

有关 IEnumeratorIEnumerable

之间区别的更多详细信息,请参阅 this 答案

此外,foreach 语句隐藏了枚举器的复杂性。 有关详细信息,请参阅 IEnumerator

编译器将 foreach 变成这样的东西:

CircularList<string> testList=new CircularList<string>();

IEnumerator testEnumerator= testList.GetEnumerator();
while (testEnumerator.MoveNext())
{
  string yourForEachIteratorVariable = (string)testEnumerator.Current
   ...
}

Please note that the codes here are only for the illustration purposes. You could/should modify to make it more flexible and "performant" according to your need/requirement.

而对于 链表 ,你不需要支持 List<T>,你可以简单地 add/insert 在你的 head 节点和实施 GetEnumerator() 如下所示:

 public IEnumerator<T> GetEnumerator()
  {
   var node = start;
   while(node != null)
   {
    yield return node.info;
    node = node.next;
 }
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
 return GetEnumerator();
}