Jak mogę zamienić a List<MyObject>
na an, IEnumerable<MyObject>
a następnie ponownie?
Chcę to zrobić, aby uruchomić serię instrukcji LINQ na liście, np Sort()
c#
linq
list
ienumerable
TK.
źródło
źródło
Odpowiedzi:
źródło
using System.Linq;
albo nie będziesz w stanie ToList ()A
List<T>
jestIEnumerable<T>
, więc w rzeczywistości nie ma potrzeby „konwertowania” aList<T>
naIEnumerable<T>
. Ponieważ aList<T>
jest anIEnumerable<T>
, możesz po prostu przypisać aList<T>
do zmiennej typuIEnumerable<T>
.Z drugiej strony nie każdy
IEnumerable<T>
jestList<T>
offcourse, więc będziesz musiał wywołaćToList()
metodę składowąIEnumerable<T>
.źródło
A
List<T>
już jestIEnumerable<T>
, więc możesz uruchamiać instrukcje LINQ bezpośrednio naList<T>
zmiennej.Jeśli nie widzisz metod rozszerzenia LINQ, jak
OrderBy()
zgaduję, to dlatego, że nie maszusing System.Linq
dyrektywy w pliku źródłowym.Musisz jednak przekonwertować wynik wyrażenia LINQ z powrotem na
List<T>
jawnie, chociaż:źródło
Poza tym: Zwróć uwagę, że standardowe operatory LINQ (zgodnie z wcześniejszym przykładem) nie zmieniają istniejącej listy -
list.OrderBy(...).ToList()
utworzą nową listę na podstawie ponownie uporządkowanej sekwencji. Tworzenie metody rozszerzającej, która pozwala na używanie lambd zList<T>.Sort
:Następnie możesz użyć:
Spowoduje to zaktualizowanie istniejącej listy w taki sam sposób, jak
List<T>.Sort
zwykle.źródło
ToList
- jednak wyjaśnię.Konwersja
List<T>
doIEnumerable<T>
List<T>
implementsIEnumerable<T>
(i wiele innych, takich jakIList<T>, ICollection<T>
), dlatego nie ma potrzeby konwertowania listy z powrotem na IEnumerable, ponieważ jest to już plikIEnumerable<T>
.Przykład:
Możesz także użyć
Enumerable.AsEnumerable()
metodyKonwersja
IEnumerable<T>
doList<T>
Jest to przydatne w Entity Framework .
źródło
Aby zapobiec powielaniu w pamięci, Resharper sugeruje, że:
.ToList () zwraca nową niezmienną listę. Tak więc zmiany w listAgain nie mają wpływu na myList w odpowiedzi @Tamas Czinege. W większości przypadków jest to poprawne z co najmniej dwóch powodów: Pomaga to zapobiec zmianom w jednym obszarze wpływającym na inny obszar (luźne sprzężenie) i jest bardzo czytelne, ponieważ nie powinniśmy projektować kodu z problemami kompilatora.
Ale są pewne przypadki, takie jak bycie w ciasnej pętli lub praca w systemie osadzonym lub o małej ilości pamięci, w których należy wziąć pod uwagę kwestie związane z kompilatorem.
źródło