2017-03-14 2 views
0

Ich glaube nicht, dass ich IEnumerable verstehe und mehrere Google-Suche durchgeführt haben.C# IEnumerable Implementierung

Ich soll einen Container von einigen Objekten machen, wobei die Klasse Container die Aktualisierung der Sammlung bearbeiten soll, die der Container darstellt (hinzufügen, entfernen).

die Sammlung Container sollte und Instanz von IEnumerable<element> sein.

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

    } 
} 

Mein Problem ist, dass IEnumerable<Elements> eine abstrakte Art und wenn ich _elm diese Art machen kann ich nicht den Zustand des Container behandeln, selbst wenn ich es machen

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

VS Fehler beschwert sich über :

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

ich weiß, dass es mehrere Antworten zu IEnumerable, aber sie helfen mir nicht.

+1

Was ist der Unterschied zwischen 'Element' und' Elements'? Sie erben 'IEnumerable ', aber deklarieren Sie den Rückgabetyp von 'GetEnumerator' als 'IEnumerator ' und Ihre fehlende generische 'IEnumerator GetEnumerator()' Methode. –

+1

Wenn Sie in Visual Studio die Verknüpfung 'Schnittstelle implementieren' verwenden, werden die Methoden erstellt, die Sie implementieren müssen. Gemäß der Antwort von xanatos, die die fehlende GetEnumerator-Methode mit ihrer korrekten Rückgabetyp enthält. –

+0

Warum erben Sie von IEnumerable? Und warum hast du drei verschiedene Listen? Sie können eine Wrapperklasse um ein IEnumerable (z. B. eine Liste) haben und über Methoden verfügen, die aus dieser Liste hinzufügen/entfernen. –

Antwort

3

Sie vermissen die IEnumerable.GetEnumerator(): IEnumerable<T> erbt von IEnumerable. In Ihrer Klasse benötigen Sie also zwei verschiedene GetEnumerator() mit zwei verschiedenen Rückgabetypen.

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

Das nächste Mal, wenn Sie eine Schnittstelle zu implementieren haben, schlage ich vor, dass Sie sich in Visual Studio auf der Schnittstelle klicken und die Implement Interface wählen Sie das Skelett aller Methoden, die Sie benötigen.