如何创建循环列表的GetEnumerator?

时间:2015-05-26 04:20:17

标签: c# foreach enumerator circular-list

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

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

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

            public Node() {

            }

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

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

这是CircularList<T>

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课程需要GetEnumerator()

实际上我可以遍历我的所有循环列表,但我使用do-while并且我需要Node<T>来启动循环。但我不想使用Nodedo-while

如何创建GetEnumerator()?

任何帮助表示赞赏。 :)

谢谢

注意:我真的非常不了解IEnumerable这些事情,请通过示例和解释轻松一下。

1 个答案:

答案 0 :(得分:0)

您需要在GetEnumerator()中实施IEnumerable方法才能使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维护Tinsertupdate类型delete的列表。

修改

myList只是“自定义”列表的后备存储。只要您正确实现基础功能,myList可以是数组,arraylist等。 为简单起见,我在这里使用了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
   ...
}
  

请注意,此处的代码仅用于说明目的。您可以/应该根据您的需要/要求进行修改以使其更加灵活和“高效”。

对于链接列表,您不需要支持List<T>,只需在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();
}