Wie kann ich ein List<MyObject>
in ein IEnumerable<MyObject>
und dann wieder zurück konvertieren ?
Ich möchte dies tun, um eine Reihe von LINQ-Anweisungen in der Liste auszuführen, z Sort()
c#
linq
list
ienumerable
TK.
quelle
quelle
Antworten:
quelle
using System.Linq;
oder du wirst nicht in der Lage sein, ToList ()A
List<T>
ist einIEnumerable<T>
, also besteht eigentlich keine Notwendigkeit, aList<T>
in ein umzuwandelnIEnumerable<T>
. Da a einList<T>
istIEnumerable<T>
, können Sie a einfachList<T>
einer Variablen vom Typ zuweisenIEnumerable<T>
.Umgekehrt ist nicht jeder
IEnumerable<T>
einList<T>
Offcourse, daher müssen Sie dieToList()
Member-Methode von aufrufenIEnumerable<T>
.quelle
A
List<T>
ist bereits einIEnumerable<T>
, sodass Sie LINQ-Anweisungen direkt für IhreList<T>
Variable ausführen können .Wenn Sie die LINQ-Erweiterungsmethoden nicht so sehen, wie
OrderBy()
ich vermute, liegt das daran, dassusing System.Linq
Ihre Quelldatei keine Direktive enthält.Sie müssen das Ergebnis des LINQ-Ausdrucks jedoch
List<T>
explizit wieder in ein Ergebnis konvertieren :quelle
Nebenbei: Beachten Sie, dass die Standard-LINQ-Operatoren (wie im vorherigen Beispiel) die vorhandene Liste nicht ändern. Sie
list.OrderBy(...).ToList()
erstellen eine neue Liste basierend auf der neu geordneten Reihenfolge. Es ist jedoch ziemlich einfach, eine Erweiterungsmethode zu erstellen, mit der Sie Lambdas verwenden können mitList<T>.Sort
:Dann können Sie verwenden:
Dadurch wird die vorhandene Liste auf die gleiche Weise aktualisiert , wie dies
List<T>.Sort
normalerweise der Fall ist.quelle
ToList
- ich werde es jedoch klarstellen.Konvertieren
List<T>
inIEnumerable<T>
List<T>
implementiertIEnumerable<T>
(und viele andere wieIList<T>, ICollection<T>
), daher besteht keine Notwendigkeit, eine Liste zurück in IEnumerable zu konvertieren, da es bereits eineIEnumerable<T>
.Beispiel:
Sie können auch die
Enumerable.AsEnumerable()
Methode verwendenKonvertieren
IEnumerable<T>
inList<T>
Dies ist in Entity Framework nützlich .
quelle
Um Doppelarbeit im Speicher zu vermeiden, schlägt resharper Folgendes vor:
.ToList () gibt eine neue unveränderliche Liste zurück. Änderungen an listAgain wirken sich also nicht auf myList in der Antwort von @Tamas Czinege aus. Dies ist in den meisten Fällen aus mindestens zwei Gründen richtig: Dies verhindert Änderungen in einem Bereich, die sich auf den anderen Bereich auswirken (lose Kopplung), und ist sehr gut lesbar, da wir keinen Code mit Compiler-Bedenken entwerfen sollten.
Es gibt jedoch bestimmte Fälle, z. B. in einer engen Schleife oder bei der Arbeit an einem eingebetteten System oder einem System mit wenig Arbeitsspeicher, bei denen Compiler-Überlegungen berücksichtigt werden sollten.
quelle