Verwenden von LINQ für ein Objekt, das nur über GetEnumerator () verfügt
Können Sie die Verwendung von LINQ in ein Objekt, das stellt nur Add(), Remove(), Count(), Item() und GetEnumerator() aus dem System.Sammlungen.IEnumerator?
InformationsquelleAutor der Frage Salvador | 2009-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den vorhandenen Linq-erweiterungsmethoden arbeiten auf Objekte, die zur Umsetzung von
IEnumerable<T>
. Ich nehme an, Ihr Objekt implementiert die nicht-generischeIEnumerable
- Schnittstelle. In diesem Fall können Sie dieCast<T>
Erweiterung Methode, um einen generischenIEnumerable<T>
wrapper. Zum Beispiel, wenn die Elemente vom Typint
:Nun können Sie mit Linq auf der Hülle
InformationsquelleAutor der Antwort Thomas Levesque
Nicht direkt. Sie könnten ziemlich leicht zu schreiben
SingleShotEnumerable<T>
obwohl:Dies wird vorausgesetzt, Sie eigentlich haben eine
IEnumerator<T>
. Wenn Sie nurIEnumerator
Sie schreiben konnten, etwas ähnlich, nur die UmsetzungIEnumerable
dann verwenden SieCast
oderOfType
um eineIEnumerable<T>
.(Hinweis: dies ist nicht thread-safe. Man könnte es so machen, mit sperren, wenn Sie wirklich wollten.)
Könnten Sie dann tun:
... aber Sie konnte nicht verwenden Sie den Abfrage-doppelt.
Wie haben Sie in die seltsame situation, dass ich nur eine
IEnumerator<T>
überhaupt? Das ist ziemlich selten. Sehen Sie, wenn Sie können Ihre design-Weise, um zu vermeiden, dass Sie etwas tun, wie oben, die ist sehr zerbrechlich.(Eine alternative wäre die "drain" - die
IEnumerator<T>
zu einemList<T>
oder etwas ähnliches, aber das hat Probleme im Umgang mit großen oder potenziell unendliche - Sequenzen.)InformationsquelleAutor der Antwort Jon Skeet
Nein, Sie können nicht. Alle LINQ-Methoden-Erweiterungen sind Methoden für die
IEnumerable<T>
- Schnittstelle.So müssen Sie implementieren
IEnumerable<T>
LINQ mit Ihren eigenen Kollektionen.InformationsquelleAutor der Antwort Philippe Leybaert