Was ist der Grund dafür, dass IEnumerable / IEnumerableT-Schnittstellen nur über MoveNext verfügen?

7

Grundsätzlich frage ich mich, warum MS beschlossen hat, einen Enumerator zu implementieren, der nur vorwärts unterstützt: MoveNext() .

Ist es nicht flexibler, auch MovePrevious für diese weit verbreitete Schnittstelle im gesamten .NET Framework zu erzwingen?

Ich kann mir vorstellen, dass es die Linq.Reverse viel einfacher für MS und effizienter in der Leistung zu implementieren, aber ich bin mir nicht sicher, ob dies andere Dinge langsamer macht oder einen massiven Aufwand für alles andere verursacht.

Wer mehr Wissen zu diesem Thema hat, kann hier mehr dazu sagen? d.h. die Vor- und Nachteile von MovePrevious in IEnumerable/IEnumerable<T> oder nicht.

    
Joan Venge 26.11.2009, 23:18
quelle

5 Antworten

21

IEnumerable[<T>] repräsentiert eine Sequenz von Daten, keine zufällige Zugriffsliste. Nicht alle Sequenzen können umgekehrt oder sogar wiederholt werden. Sequenzen basierend auf Netzwerk-Streams, Datenbankzugriff, etc. - oder diese Schönheit:

%Vor%

Das Beste, was Sie tun können, ist, erneut zu starten - nicht , indem Sie Reset() aufrufen (was veraltet ist), sondern stattdessen einen neuen Enumerator.

Auch ohne Random ist es trivial, einfache Sequenzen zu finden, die nicht umgekehrt werden können (ohne den Puffer zu puffern und umzukehren). Was Sie wollen, betrachten Sie stattdessen IList[<T>] - Sie können auf Daten über den Indexer in der Reihenfolge any zugreifen.

    
Marc Gravell 26.11.2009 23:23
quelle
6

Es gibt viele Arten von Daten, bei denen es keinen Sinn macht, ein MovePrevious zu haben. Wenn Sie z. B. Daten von einer Netzwerkverbindung empfangen, würde das Bereitstellen eines MovePrevious-Objekts das Zwischenspeichern des gesamten Streams erfordern, für den Fall, dass Sie diese Methode aufgerufen haben. Dies würde sehr viel Speicher verschwenden.

Nachdem das gesagt wurde, könnte es nützlich sein, einen anderen -Typ zu haben, der sowohl MoveNext als auch MovePrevious unterstützt (eine doppelt verknüpfte Liste könnte dies zum Beispiel unterstützen).

    
Mark Byers 26.11.2009 23:21
quelle
1

Der Bedienungskomfort ist nicht der einzige Faktor, der beim Entwerfen einer Schnittstelle eine Rolle spielt ... Sie müssen berücksichtigen, wie vielseitig es ist und welche Einschränkungen Sie hinzufügen.

Es gibt Sequenzen, die nicht wiedergegeben werden können, und Sie würden viele unnötige Anforderungen hinzufügen, um es zu implementieren.

Es gibt noch andere Schnittstellen wie IList, IQueryable. Mit dem am besten geeigneten Szenario wird auch die Art der Verwendung kommuniziert, die es haben sollte.

    
eglasius 26.11.2009 23:32
quelle
1

Die Implementierung eines MovePrevious würde es zu einer viel schwereren Schnittstelle machen. Während für einige Quellen (Array, Container-Klassen) ein MovePrevious trivial wäre, würde es für viele andere Quellen eine teure Pufferung erfordern oder diese Quellen ausschließen. Netzwerkströme und Datenbankverbindungen unterstützen keine Suchvorgänge.

    
Henk Holterman 26.11.2009 23:22
quelle
0

Es hat mit dem Muster bezüglich "Ertrag" zu tun. Effektiv sind Aufzählungen die einfachste mögliche Sammlung, Sie beginnen einfach an der Front und nehmen bis zum Ende. Dies bedeutet, dass sie den Code zur Implementierung der Enumeration extrem einfach implementieren.

Sie können auch Funktionscode mit Iteratoren haben, die niemals als solche "enden", zum Beispiel

%Vor%

Sie werden einfach steigende Zahlen erhalten, bis Sie aufhören.

    
Spence 26.11.2009 23:24
quelle

Tags und Links