2012-12-06 12 views
8

Jak działa metoda rozszerzenia ToList()? Załóżmy, że mam IEnumerable z 10000 pozycji. Czy ToList() utworzy nowy List i iterować po IEnumerable z 10000 elementów, a następnie zwrócić mi List lub robi .NET zrobić to w jakiś inny sposób?Jak działa ToList() w pracy IEnumerable?

Ta MSDN link mówi o natychmiastowym wykonaniu zapytania DB. Moje pytanie dotyczy tylko konwersji IEnumerable na List.

Odpowiedz

22

To niekoniecznie musi być iteracyjne, chociaż jest to scenariusz "najgorszego przypadku". Zasadniczo nazywa się new List<T>(source), ale ma kilka sztuczek w rękawie: jeśli źródło implementuje ICollection<T>, konstruktor może wywołać ICollection<T>.CopyTo(), aby skopiować kompletne dane do tablicy. To może być lepiej wdrożone niż pojedyncza iteracja. Podobnie w przypadku ICollection<T>, nowa lista zna ostateczny rozmiar na początek, więc nie będzie musiał rozszerzać wewnętrznych buforów.

Aby uzyskać więcej informacji, zobacz mój Edulinq ToList() blog post.

+0

Powyższy link nie działa. Możesz przejść do posta Jona tutaj - [Edulinq ToList() wpis na blogu] (https://codeblog.jonskeet.uk/2011/01/01/reimplementing-linq-to-objects-part-20-tolist/) – vibhu

+0

@ vibhu: Zaktualizowano link. –

2

Metoda rozszerzenia .ToList wywołuje konstruktor List<T> przekazując go jako IEnumerable<T>. Ten konstruktor wykona iterację po numerze IEnumerable<T> i skopiuje elementy należące do IEnumerable<T> w takiej samej kolejności, w jakiej zostały zwrócone.

Powiązane problemy