2013-08-21 67 views
1

所以我有一個通用類Node<T>看起來像這樣。它只是持有的價值和參考下一Node<T>自定義集合無法實現IEnumerable <T>

public class Node<T> 
{ 
    public T Value { get; set; } 
    public Node<T> Next { get; set; } 

    // Some Methods go here 
} 

還有一個叫CustomLinkedList<T>類,它看起來像這樣

public class CustomLinkedList<T> : IEnumerable<T> 
{ 
    Node<T> m_first; 
    Node<T> m_current; 
    int m_length; 

    public CustomLinkedList() 
    { 
     m_first = new Node<T>(); 
     m_current = m_first; 
     m_length = 0; 
    } 

    // Adding, removing and other methods go here 
} 

Baisically CustomLinkedList<T>Node<T> S中的集合。這對我自己來說只是一個挑戰,建立像LinkedList<T>這樣的集合(至少我認爲是這樣)。下面的代碼顯示了我如何實現添加功能的示例。

public void AddLast(T value) 
{ 
    m_current.Value = value; 
    m_current.Next = new Node<T>(); 
    m_current = m_current.Next; 
    m_length++; 
} 

public void AddFirst(T value) 
{ 
    Node<T> newFirst = new Node<T>(); 
    newFirst.Value = value; 
    newFirst.Next = m_first; 
    m_first = newFirst; 
    m_length++; 
} 

也有AddAfter()AddBefore()方法一起用一些RemoveXXX()方法。所以我想CustomLinkedList<T>實現IEnumerable<T>和我GetEnumerator()方法看起來像這樣

public IEnumerator<T> GetEnumerator() 
{ 
    if (m_length > 0) 
    { 
     Node<T> nodeToReturn = m_first; 
     for (int i = 0; i < m_length; i++) 
     { 
      if (nodeToReturn == null) 
       break; 
      yield return nodeToReturn.Value; 
      nodeToReturn = nodeToReturn.Next; 
     } 
    } 
} 

但是,編譯器會抱怨以下

CustomGenericCollections.CustomLinkedList<T>' does not implement interface member 'System.Collections.IEnumerable.GetEnumerator()'. 'CustomGenericCollections.CustomLinkedList<T>.GetEnumerator()' cannot implement 'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching return type of 'System.Collections.IEnumerator'.

我想不出有什麼問題。

回答

4

因爲IEnumerable<T>繼承自IEnumerable,所以還需要實現非通用的GetEnumerator()。添加到您的班級:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 
+0

謝謝。按預期工作。 – Dimitri

相關問題