Warum IEnumerable<T>.Reverse()
die umgekehrte Sammlung mit der ursprünglichen Sammlung zurückgibt und List<T>
kehrt die ursprüngliche Sammlung selbst um? Dies ist für mich etwas verwirrend, da List<T>
von IEnumerable<T>
erbt.Unterschied zwischen IEnumerable <T> .Reverse & List <T> .Reverse
Antwort
Konzeptionell kann dies sein, weil IEnumerable
verwendet wird, wenn Sie eine unveränderliche Sammlung von Elementen darstellen möchten. Das heißt, Sie möchten nur die Elemente in der Liste lesen, aber nicht hinzufügen/einfügen/löschen oder die Sammlung anderweitig ändern. In dieser Ansicht der Daten ist die Rückgabe eines neuen IEnumerable
in einer anderen Reihenfolge das erwartete Ergebnis. Wenn Sie eine List
verwenden, erwartet, dass Sie die Auflistung hinzufügen/einfügen/löschen oder anderweitig mutieren können, so würde in diesem Kontext eine Reverse
Methode erwartet, die die Reihenfolge der ursprünglichen Liste ändert.
Wie andere festgestellt haben IEnumerable
ist eine Schnittstelle und List
ist eine Klasse. List
implementiert IEnumerable
.
So
IEnumerable<String> names = new List<String>();
var reversedNames = names.Reverse();
bekommt man eine zweite Liste, rückgängig gemacht. Ange
List<String> names = new List<String>();
names.Reverse();
Kehrt Ihre ursprüngliche Liste. Ich hoffe das macht Sinn.
Reverse
auf IEnumerable<T>
ist Teil von Linq und wird als Erweiterungsmethode hinzugefügt (Enumerable.Reverse<T>
). Es wurde hinzugefügt, nachdem Reverse
für List<T>
implementiert wurde.
IEnumerable<T>
ist auch keine Sammlung von Objekten. Es sagt nur dem Verbraucher, wie man an diese Gegenstände gelangt.
Diese Antwort ist die einzige, die das * warum * erklärt: * "Es wurde hinzugefügt, nachdem' Reverse' für 'Liste
Weil sie zwei verschiedene Methoden sind.
List<T>.Reverse
ist eine Instanzmethode unter List<T>
. Dies ändert die Liste an Ort und Stelle.
Enumerable.Reverse<T>
ist eine Erweiterungsmethode auf IEnumerable<T>
. Dies erstellt eine neue Sequenz, die die Quellsequenz in umgekehrter Reihenfolge aufzählt.
Sie letzteres auf einem List<T>
verwenden können, indem sie als statische Methode aufrufen:
var list = new List<string>{"1","2"};
var reversed = Enumerable.Reverse(list)
oder durch zu IEnumerable<T>
Gießen:
IEnumerable<string> list = new List<string>{"1","2"};
var reversed = list.Reverse();
beiden In diesen Fällen bleibt list
unverändert und reversed
wenn Aufzählung gibt {"2","1"}
zurück.
Ich habe eine Erweiterungsmethode 'Reverse ** d **' hinzugefügt das ist einfach umständlich.Reverse - ziemlich oft wollen Sie Unveränderlichkeit, und jetzt können Sie es einfach ohne Casting oder anderen Boilerplate-Code nennen. –
Dies sind verschiedene Methoden, denken Sie daran. Im Grunde anders, mit nichts gemeinsamem als einem Namen.
void List.Reverse
ist eine Methode der List-Instanz nur, und es erfolgt eine Umkehrung der Liste oder eines Teils davon.
IEnumerable Enumerable.Reverse
ist eine Erweiterungsmethode (BTW IList
hat es auch!) Erstellt ein neues Enumerable mit umgekehrter Reihenfolge.
Es gibt nicht so etwas wie IEnumerable<T>.Reverse()
Es ist Enumerable.Reverse<T>(this IEnumerable<T>)
und es ist Extension-Methode von Linq auf alle IEnumerable<>
angewendet.
Jetzt, wo wir festgestellt haben, wann sie herkommen, ist es leicht zu verstehen, warum sie so unterschiedlich sind. Linq fügt Methoden zum Erstellen von "Verarbeitungsstreams" hinzu, und es wird durch das Erstellen einer neuen Instanz jedes Mal erreicht.
List<T>.Reverse()
ist eine Methode von List
und wie alle seine Methoden (zB Add
) ändert direkt die Instanz.
IEnumerable<T>
hat eine zugrunde liegende Implementierung, die List<T>
, Hashtable<T>
oder etwas anderes sein könnte, das IEnumerable implementiert.
List<T>
selbst ist die Implementierung, so dass Sie diese Instanz direkt ändern können.
Und wie alle anderen bereits erwähnt haben, ist eine eine Erweiterungsmethode und Teil von Linq, und eine ist direkt auf den Typ implementiert.
'IEnumerable' ist eine Schnittstelle und 'List ' erbt es nicht, es ** implementiert ** es. Das ist ein großer Unterschied. –
MarcinJuraszek