2015-05-15 7 views
6

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

+1

'IEnumerable ' ist eine Schnittstelle und 'List ' erbt es nicht, es ** implementiert ** es. Das ist ein großer Unterschied. – MarcinJuraszek

Antwort

6

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.

3

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.

+0

Diese Antwort ist die einzige, die das * warum * erklärt: * "Es wurde hinzugefügt, nachdem' Reverse' für 'Liste ' "implementiert wurde * –

7

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.

+0

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

0

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.

0

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.

0

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.

Verwandte Themen