Frage

Ich habe eine dieser Code

public class SomeClass<T>: IEnumerable<T>
{
    public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

Wie kann ich Extrahieren Sie eine IEnumerator von MyList?

Danke StackoverFlower ....

War es hilfreich?

Lösung

Dieses:

public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

Anforderungen, dies sein:

public List<T> MyList = new List<T>();

dann sollte diese Arbeit:

public IEnumerator<T> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

Sie können ein nicht haben

List<SomeClass<T>>

, dass Sie den Enumerator für ziehen, weil Sie in der Schnittstelle festgelegt haben, dass der Enumerator wird einen zählbaren Artikel von <T> zurückzukehren. Sie können auch IEnumerable<T> ändern sein

IEnumerable<SomeClass<T>>

und den Enumerator ändern sein

public IEnumerator<SomeClass<T>> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

Andere Tipps

Die triviale Option würde return MyList.GetEnumerator() werden.

Kevins Antwort ist die richtig und ist faul (noch besser). Wenn Sie Trodek Antwort ist die folgende Ausnahme throw sein wird:

Cannot implicitly convert type `System.Collections.Generic.List<SomeClass<T>>.Enumerator' to `System.Collections.Generic.IEnumerator<T>'(CS0029)

Dennoch möchte ich einen Kommentar hinzuzufügen. Wenn Sie yield return eine Zustandsmaschine erzeugt, die die unterschiedlichen Werte zurückkehren werden. Wenn Sie vorhaben, verschachtelte Datenstrukturen (Bäume zum Beispiel) verwenden yield return verwenden wird weit mehr Zuweisen von Speicher, weil eine andere Zustandsmaschine wird in jeder Unterstruktur erstellt werden.

Nun, das sind meine zwei Cent!

Unter der Annahme, es ist ein Weg, ein Objekt T aus einem Objekt Someclass zu bekommen,

public IEnumerator<T> GetEnumerator()
{
    return MyList.Select(ml => ml.GetT() /* operation to get T */).GetEnumerator();
}

Als schöne Ergänzung zu der akzeptierten Antwort, wenn Sie die Nachricht empfangen

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

Sie müssen die zusätzliche GetEnumerator() Methode implementieren:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

IEnumerable<T> implementiert IEnumerable so beide Formen der GetEnumerator() umgesetzt werden müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top