Ich habe eine Liste:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
Ich möchte eine Transformation auf Elemente meiner Liste anwenden. Ich kann dies auf zwei Arten tun:
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
Was ist der Unterschied zwischen diesen beiden Möglichkeiten?
Antworten:
Select
ist eine LINQ-Erweiterungsmethode und funktioniert für alleIEnumerable<T>
Objekte, währendConvertAll
sie nur von implementiert wirdList<T>
. DieConvertAll
Methode existiert seit .NET 2.0, während LINQ mit 3.5 eingeführt wurde.Sie sollten bevorzugen
Select
über ,ConvertAll
wie es für jede Art von Liste funktioniert, aber sie denselben im Grunde tun.quelle
Select
undConvertAll
. Ersteres wählt jedes Element in einer Sequenz aus und Sie können damit tun, was Sie wollen. Letzteres hat eine klare Absicht: diesen Gegenstand in etwas anderes umwandeln.ConvertAll
ist keine Erweiterung, sondern eine Methode in der Listenklasse. Sie müssenToList
das Ergebnis nicht aufrufen, da es bereits eine Liste ist:Der Unterschied besteht also darin, dass die
ConvertAll
Methode nur für eine Liste verwendet werden kann und eine Liste zurückgibt. DieSelect
Methode kann für jede Sammlung verwendet werden, die dieIEnumerable<T>
Schnittstelle implementiert , und gibt eine zurückIEnumerable<T>
.Außerdem verarbeiten sie die Verarbeitung unterschiedlich, sodass sie ihre Stärken in unterschiedlichen Situationen haben. Die
ConvertAll
Methode durchläuft die Liste und erstellt auf einmal eine neue Liste, während dieSelect
Methode die verzögerte Ausführung verwendet und die Elemente nur nach Bedarf verarbeitet. Wenn Sie nicht alle Elemente benötigen, ist dieSelect
Methode effizienter. Auf der anderen Seite, einmalConvertAll
hat die Liste zurückgegeben, müssen Sie nicht die ursprüngliche Liste zu halten.quelle
Select
.Die erste Antwort sollte nicht die akzeptierte sein. Ich bin ein ehemaliger 2007 C # Microsoft MVP.
Im Gegensatz zur akzeptierten Antwort
ConvertAll
ist es viel effizienter als die Kombination vonSelect
undToList()
.Erstens
ConvertAll
ist es streng schneller und es verwendet die minimale Menge an Speicher, um dies zu tun. Entspricht Array.ConvertAll vs Select und ToArray. Dies wäre bei einem Array mit größerer Länge oder vielen Aufrufen innerhalb einer Schleife viel offensichtlicher.1)
ConvertAll
kennt die Größe der endgültigen Liste und vermeidet die Neuzuweisung des Basisarrays.ToList
() ändert die Größe des Arrays mehrmals.2)
ToList
führt langsamere Schnittstellenaufrufe durchIEnumerable<>
, währendConvertAll
das zugrunde liegende Array ohne zusätzliche Aufrufe oder Bereichsprüfungen durchlaufen wird.3) Mit Auswahl wird ein zusätzliches
IEnumerable<T>
Objekt erstellt.quelle
Ich weiß, dass dies etwas spät ist, aber ich habe noch hinzugefügt, weil dies in Zukunft für andere von Nutzen sein könnte.
Wenn Sie es im EntityFramework-Abfrageausdruck verwenden, wird nicht empfohlen, ConvertAll () zu verwenden, da es den Ausdruck auswertet, anstatt ihn als Ausdruck für die zukünftige Verwendung zu belassen. Dies beeinträchtigt die Ausführungsleistung von Datenbankabfragen erheblich, da vor der Auswertung des endgültigen Ausdrucks die Anzahl der Aufrufe erfolgen müsste.
quelle
ConvertAll
handelt es sich um eine MethodeList<T>
. Bis Sie haben die Liste, haben Sie bereits Ihren Ausdruck ausgewertet. Aber Sie haben Recht - wenn Sie nicht alle bewerten möchten,Select
ist dies vorzuziehen.