Frage

Gibt es nicht wiederholbare IEnumerable Klassen?

Mit dem nicht wiederholbaren ich meine, wo man nicht sicher GetEnumerator mehrmals aufrufen können oder wo Aufruf GetEnumerator beobachtbare Nebenwirkungen hat.

War es hilfreich?

Lösung

File.ReadLines() hat eine IEnumerable<T> zurück, die nur einmal funktioniert.

Andere Tipps

Es ist möglich, für Implementierungen von IEnumerable (Of T) Ware zurücks Gutdünken, für welchen Gründen auch immer. Es ist ziemlich gut zu erwarten, dass, wenn man GetEnumerator zweimal auf der gleichen Reihenfolge der Elemente nennt, und läuft dann weiter, um durch beide Aufzählungen, sollten sie entweder die gleichen Elemente in der gleichen Reihenfolge ergeben oder eine Ausnahme werfen. Es gibt eine Reihe von Routinen, die eine IEnumerable (Of T) annehmen und wird schlecht ausfallen, wenn man bedenkt, dass nicht durch einen solchen Vertrag nicht einhält.

Wenn ich meine druthers hätte, würde IEnumerable in eine Familie von Schnittstellen aufgeteilt wurden; die grundlegenden IEnumerable des enumerator würde die Reset-Methode verlieren und keine besonderen Versprechen Wiederholbarkeit vermitteln würde. Eine neue IMultiEnumerable würde einen Enumerator mit einer Reset-Methode zurück und und eine Garantie, dass mehrere Durchgänge identische Daten ergeben würden; könnte der Enumerator auch seine eigene Methode GetEnumerator unterstützen (ich denke, dass für jede Art praktisch sein sollte, die Multi-Pass-Enumeration unterstützen könnte, die nur Kosten ein ‚Start‘ Zeiger so die verschachtelte enumerator an den Ort seiner ursprünglichen zurückgesetzt werden würde wäre Schöpfung).

Nein, jeder gut verhalten Klasse, die IEnumerable wiederholt Aufzählungen können implementiert.

Sammlungen aufzuzählen, die nicht wiederholbar sind, haben Sie nicht eine Klasse, die IEnumerable implementiert. Stattdessen haben Sie eine Methode, die einen Enumerator zurück. Auf diese Weise der Enumerator statt einer Klasse hält die Sammlung, so ist es nicht möglich GetEnumerator zweimal für die gleiche Sammlung zu nennen. Um es wiederholen den Enumerator müssen Sie die Methode aufrufen, eine neue Sammlung zu erstellen.

Ein Beispiel hierfür ist die Enumerable.Range Methode. Es schafft die Elemente für einen Bereich im laufenden Betrieb, so dass der Bereich nicht als eine Sammlung existiert, die es nicht wiederholbar macht. den gleichen Bereich aufzuzählen wieder die Methode rufen Sie einen neuen Bereich mit den gleichen Grenzen zu schaffen.

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