2017-03-14 11 views
0

私はIEnumerableを理解しているとは思わないし、いくつかのGoogle検索を行っています。C#IEnumerable implementation

私はいくつかのオブジェクトのコンテナを作成することになっています。クラス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このタイプを作る場合、私はそれが

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

VSはエラーについて不平を言う作る場合でもContainerの状態を扱うことができません:

'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から継承していますか?そしてなぜあなたは3つの異なるリストを持っていますか? IEnumerable(Listなど)の周りにラッパークラスを持ち、そのリストから追加/削除するメソッドを持つことができます。 –

答えて

3

IEnumerable.GetEnumerator()がありません:IEnumerable<T>IEnumerableから継承されています。あなたのクラスでは、2つの異なる返品タイプを持つ2つの別個の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を選択示唆しています。