Effizientes Konvertieren von IEnumerable in List in C#
Dieser Artikel untersucht verschiedene Methoden zum Konvertieren eines IEnumerable<T>
in eine List<T>
in C# und vergleicht deren Effizienz und Eignung für verschiedene Szenarien. Das Verständnis der Nuancen dieser Datenstrukturen ist entscheidend für das Schreiben von optimiertem und wartbarem Code.
Inhaltsverzeichnis
- Verständnis von
IEnumerable<T>
undList<T>
- Wann sollte
IEnumerable<T>
inList<T>
konvertiert werden? - Verwendung der
ToList()
-Methode - Verwendung des
List<T>
-Konstruktors - Verwendung der LINQ-Abfragesyntax
- Verwendung einer
foreach
-Schleife - Erstellen von benutzerdefinierten Erweiterungsmethoden
- Fazit
Verständnis von IEnumerable<T>
und List<T>
Sowohl IEnumerable<T>
als auch List<T>
arbeiten mit Sammlungen, aber ihre Eigenschaften unterscheiden sich erheblich:
IEnumerable<T>
: Dieses Interface repräsentiert eine Sequenz von Elementen, die mit einerforeach
-Schleife durchlaufen werden können. Es ist schreibgeschützt; Elemente können nicht direkt hinzugefügt, entfernt oder geändert werden. Es ist ideal für Szenarien, in denen Elemente sequenziell verarbeitet werden müssen, ohne dass ein direkter Zugriff oder eine Modifikation erforderlich ist.List<T>
: Eine konkrete Klasse, die ein dynamisch dimensioniertes Array repräsentiert. Sie bietet Methoden zum Hinzufügen, Entfernen, Einfügen und Zugreifen auf Elemente über den Index. Bietet Flexibilität für die Manipulation, verbraucht aber mehr Speicher, da die gesamte Sammlung im Speicher gespeichert wird.
Wann sollte IEnumerable<T>
in List<T>
konvertiert werden?
Eine Konvertierung ist notwendig, wenn:
- Direkter Zugriff:
List<T>
ermöglicht den direkten Zugriff (z. B.myList[5]
), im Gegensatz zuIEnumerable<T>
. - Änderung der Sammlung:
List<T>
unterstützt das Hinzufügen, Entfernen und Einfügen von Elementen. - Mehrfache Iterationen: Die Konvertierung in
List<T>
kann für mehrere Iterationen effizienter sein, wodurch die wiederholte Aufzählung der Quelle vermieden wird. - Methodenanforderungen: Bestimmte Methoden oder Bibliotheken erwarten eine
List<T>
als Eingabe.
Verwendung der ToList()
-Methode
Der effizienteste und empfohlene Ansatz ist die Verwendung der ToList()
LINQ-Erweiterungsmethode:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = numbers.ToList();
Verwendung des List<T>
-Konstruktors
Der List<T>
-Konstruktor akzeptiert auch ein IEnumerable<T>
:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>(numbers);
Dies ist funktional äquivalent zu ToList()
.
Verwendung der LINQ-Abfragesyntax
Obwohl möglich, ist die LINQ-Abfragesyntax weniger prägnant und effizient:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = (from number in numbers select number).ToList();
Verwendung einer foreach
-Schleife
Dies ist die am wenigsten effiziente Methode, die nur für spezifische Szenarien geeignet ist, die eine individuelle Elementverarbeitung während der Konvertierung erfordern:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>();
foreach (int number in numbers)
{
numberList.Add(number);
}
Erstellen von benutzerdefinierten Erweiterungsmethoden
Für spezielle Konvertierungen erstellen Sie benutzerdefinierte Erweiterungsmethoden. Zum Beispiel:
public static class MyExtensions
{
public static List<T> ToListAndSort<T>(this IEnumerable<T> source) where T : IComparable<T>
{
List<T> list = source.ToList();
list.Sort();
return list;
}
}
Fazit
Die ToList()
-Methode ist die optimale Wahl für die Konvertierung von IEnumerable<T>
in List<T>
in C#. Andere Methoden sind weniger effizient oder weniger lesbar, es sei denn, Sie haben einen bestimmten Grund, sie zu verwenden. Berücksichtigen Sie bei der Arbeit mit großen Datensätzen immer die Auswirkungen auf den Speicher.