Wie funktioniert ToList () in einem IEnumerable?

8

Wie funktioniert die Erweiterungsmethode ToList() ? Angenommen, ich habe ein IEnumerable von 10000 Elementen. Wird ToList() eine neue List erstellen und über die IEnumerable von 10000 Elementen iterieren und mir dann eine List zurückgeben oder macht .NET das auf andere Weise?

Dieser MSDN-Link spricht über die sofortige Ausführung einer Datenbankabfrage. Meine Frage betrifft nur die Umwandlung von IEnumerable in List .

    
Jack 06.12.2012, 06:46
quelle

2 Antworten

22
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ qstnhdr ___ Wie funktioniert ToList () in einem IEnumerable? ___ tag123list ___ Liste kann sich beziehen auf: eine verkettete Liste (eine geordnete Menge von Knoten, die jeweils auf ihren Nachfolger verweisen) oder eine Form eines dynamischen Arrays. Um nicht für HTML-Listen verwendet zu werden, verwenden Sie stattdessen [html-lists]. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ tag123ienumerable ___ IEnumerable und sein generisches Gegenstück IEnumerable sind .NET-Schnittstellen zum Iterieren (oder Aufzählen) einer Sammlung von Elementen. ___ antwort13738372 ___

Es wird nicht notwendigerweise iteriert, obwohl dies das "worst case" -Szenario ist. Im Grunde ruft es new List<T>(source) auf, aber das hat einige Tricks im Ärmel: Wenn die Quelle ICollection<T> implementiert, kann der Konstruktor ICollection<T>.CopyTo() , um die vollständigen Daten in ein Array zu kopieren. Dies kann durchaus effizienter als eine Iteration mit einem Schritt ausgeführt werden. In ähnlicher Weise kennt die neue Liste im Fall von ICollection<T> die endgültige Größe, mit der sie beginnen soll, so dass sie ihre internen Puffer nicht weiter erweitern muss.

Für ein paar weitere Details, siehe meine Edulinq ToList() Blogpost .

    
___ answer13738381 ___

Die %code% Erweiterungsmethode ruft den %code% -Konstruktor auf und übergibt ihr den %code% . Dieser Konstruktor wird über die %code% iterieren und die Elemente der %code% in der gleichen Reihenfolge kopieren, in der sie zurückgegeben werden.

    
___ qstntxt ___

Wie funktioniert die Erweiterungsmethode %code% ? Angenommen, ich habe ein %code% von 10000 Elementen. Wird %code% eine neue %code% erstellen und über die %code% von 10000 Elementen iterieren und mir dann eine %code% zurückgeben oder macht .NET das auf andere Weise?

Dieser MSDN-Link spricht über die sofortige Ausführung einer Datenbankabfrage. Meine Frage betrifft nur die Umwandlung von %code% in %code% .

    
___
Jon Skeet 06.12.2012, 06:49
quelle
3

Die .ToList Erweiterungsmethode ruft den List<T> -Konstruktor auf und übergibt ihr den IEnumerable<T> . Dieser Konstruktor wird über die IEnumerable<T> iterieren und die Elemente der IEnumerable<T> in der gleichen Reihenfolge kopieren, in der sie zurückgegeben werden.

    
Darin Dimitrov 06.12.2012 06:50
quelle

Tags und Links