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 ....
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.