Mam listę:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
Chcę zastosować transformację do elementów mojej listy. Mogę to zrobić na dwa sposoby:
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
Jaka jest różnica między tymi dwoma sposobami?
Odpowiedzi:
Select
jest metodą rozszerzenia LINQ i działa na wszystkichIEnumerable<T>
obiektach, podczas gdyConvertAll
jest implementowana tylko przezList<T>
.ConvertAll
Metoda istnieje od .NET 2.0, podczas gdy LINQ został wprowadzony z 3,5.Należy sprzyjać
Select
nadConvertAll
jak to działa na wszelkiego rodzaju listy, ale w zasadzie to samo.źródło
Select
iConvertAll
. Pierwsza z nich wybiera każdy element w sekwencji i możesz z nim zrobić, co chcesz. Ten ostatni ma jasny zamiar: przekształcić ten element w coś innego.ConvertAll
nie jest rozszerzeniem, jest to metoda z klasy list. Nie musisz wywoływaćToList
wyniku, ponieważ jest to już lista:Różnica polega więc na tym, że
ConvertAll
metoda może być używana tylko na liście i zwraca listę.Select
Sposób można stosować w każdej kolekcji implementującejIEnumerable<T>
interfejs i zwróciIEnumerable<T>
.Przetwarzają też inaczej, więc mają swoje mocne strony w różnych sytuacjach. Te
ConvertAll
metoda przebiega przez liście i tworzy nową listę w jednym kroku, natomiastSelect
metoda wykorzystuje leniwe wykonanie i przetwarza tylko elementy, jak ich potrzebujesz. Jeśli nie potrzebujesz całego przedmiotu,Select
metoda jest bardziej wydajna. Z drugiej strony, poConvertAll
zwróceniu listy, nie musisz zachowywać oryginalnej listy.źródło
Select
.Pierwsza odpowiedź nie powinna być zaakceptowana. Jestem poprzednim MVP Microsoft C # 2007.
W przeciwieństwie do przyjętej odpowiedzi,
ConvertAll
jest dużo bardziej skuteczny niż połączenieSelect
iToList()
.Po pierwsze,
ConvertAll
jest ściśle szybszy i wykorzystuje do tego minimalną ilość pamięci. To samo co Array.ConvertAll vs Select i ToArray. Byłoby to znacznie bardziej oczywiste w przypadku tablicy o większej długości lub wielu wywołań w pętli.1)
ConvertAll
zna rozmiar ostatecznej listy i unika ponownego przydzielania tablicy podstawowej.ToList
() będzie wielokrotnie zmieniać rozmiar tablicy.2)
ToList
będzie wolniejIEnumerable<>
wywoływać interfejs , podczas gdyConvertAll
przejdzie przez podstawową tablicę bez dodatkowych wywołań lub sprawdzania zakresu.3) Wybierz utworzy dodatkowy
IEnumerable<T>
obiekt.źródło
Wiem, że to trochę za późno, ale nadal dodałem, ponieważ może to być przydatne dla innych w przyszłości.
W przypadku używania go w wyrażeniu zapytania EntityFramework nie zaleca się używania ConvertAll (), ponieważ ocenia wyrażenie, zamiast pozostawiać je jako wyrażenie do wykorzystania w przyszłości. To poważnie obniża wydajność wykonywania zapytań do bazy danych, ponieważ musiałoby wykonać określoną liczbę wywołań przed oceną końcowego wyrażenia.
źródło
ConvertAll
jest metoda naList<T>
. Do czasu mieć listę, już oceniany swój wyraz. Ale masz rację - jeśli nie chcesz oceniać wszystkich,Select
lepiej.