2015-05-26 14 views
0

我必須創建自己的循環列表,我使用通用列表。如何創建我的循環列表的GetEnumerator?

第一i-創建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和那些事,請到容易的例子和說明。

+0

你實現'IEnumerable'的'GetEnumerator()'? foreach需要'GetEnumerator()'。如果你還沒有實現,你應該會得到'編譯時間錯誤'。 – ANewGuyInTown

+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保持T類型的列表,它你會insertupdatedelete

編輯

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(); 
} 
+0

謝謝,現在我明白了....我沒有看到最後一個** mylist維護你將插入,更新和刪除的類型T的列表。 +1 +接受 –

+0

使用備份列表確實會影響向消費者呈現鏈接列表的目的。 – Enigmativity

+0

@Enigmativity,請參閱我編輯的答案,支持列表類型僅用於說明「簡單」的目的。 – ANewGuyInTown