2017-03-14 70 views
0

我不認爲我理解IEnumerable並已經做了幾次谷歌搜索。C#IEnumerable的實現

我應該做一個對象的容器,其中類Container應該處理Container代表的集合(添加,刪除)的更新。

集合Container應該是和IEnumerable<element>的實例。

namespace .... 
{ 
    public class Container : Ienumerable<Elements> 
    { 
     List<Elements> _elm = new List<Elements>(); 
     List<Elements> _add = new List<Elements>(); 
     List<Elements> _rem = new List<Elements>(); 

     public voic PendAdd(Element elm) 
     { 
      _add.Add(elm); 
     } 

     public voic Pendrem(Element elm) 
     { 
      _rem.remove(elm); 
     } 

     ... 

     public IEnumerator<Element> GetEnumerator() 
     { 
      return _elm.GetEnumerator(); 
     } 

    } 
} 

我的問題是IEnumerable<Elements>是一個抽象類,如果我讓_elm這種類型的我無法處理Container的狀態,即使我讓

IEnumerable<Element> _elm = new List<Element>(); 

VS抱怨錯誤:

'Container' does not implement interface member 'IEnumerable.GetEnumerator()'. 'Container.GetEnumerator()' cannot implement 'IEnumerable.GetEnumerator()' because it does not have the matching return of 'IEnumerator'.

我知道關於IEnumerable有幾個答案,但他們不幫我。

+1

'Element'和'Elements'有什麼區別?您繼承'IEnumerable ',但將'GetEnumerator'的返回類型聲明爲'IEnumerator ',並且您缺少非泛型的'IEnumerator GetEnumerator()'方法。 –

+1

如果您在Visual Studio中使用「實現接口」快捷方式,它將創建您需要實現的方法。根據xanatos的回答,這包括缺少的GetEnumerator方法及其正確的返回類型。 –

+0

你爲什麼從IEnumerable繼承?爲什麼你有三個不同的列表?你可以圍繞一個IEnumerable(比如一個List)創建一個包裝類,並且可以添加/刪除該列表中的方法。 –

回答

3

您錯過了IEnumerable.GetEnumerator()IEnumerable<T>繼承自IEnumerable。所以在你的課堂上你需要兩個不同的GetEnumerator()以及兩種不同的返回類型。

public class Container : IEnumerable<Element> 
{ 
    List<Element> _elm = new List<Element>(); 
    List<Element> _add = new List<Element>(); 
    List<Element> _rem = new List<Element>(); 

    public void PendAdd(Element elm) 
    { 
     _add.Add(elm); 
    } 

    public void Pendrem(Element elm) 
    { 
     _rem.Remove(elm); 
    } 

    public IEnumerator<Element> GetEnumerator() 
    { 
     return _elm.GetEnumerator(); 
    } 

    // This is called "explicit interface implementation", see 
    // https://msdn.microsoft.com/en-us/library/ms173157.aspx 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     // will call the "other" GetEnumerator() 
     return GetEnumerator(); 
    } 
} 

,你必須實現一個接口下一次,我建議你右鍵單擊在Visual Studio界面上,選擇Implement Interface得到你所需要的所有方法的骨架。

相關問題