Listen in der Praxis
Hinzufügen, entfernen und suchen.
Listen in der Praxis ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum List<T>?
List<T> ist das alltägliche dynamische Array in C#. Es befindet sich in System.Collections.Generic und wächst automatisch, wenn Sie Elemente hinzufügen.
Im Gegensatz zu einem gewöhnlichen Array müssen Sie keine feste Größe im Voraus festlegen. Eine Liste ist typsicher: Eine List<int> enthält nur int-Werte, was bereits zur Kompilierzeit überprüft wird.
using System.Collections.Generic;
List<int> scores = new List<int>();
scores.Add(90);
scores.Add(85);Erstellen und Initialisieren
Sie können eine Liste mithilfe eines Collection-Initializers direkt füllen. Das ist kompakt und gut lesbar.
Der Compiler wandelt jeden Eintrag intern in einen Aufruf von Add um. Das Ergebnis ist daher identisch mit dem Hinzufügen der Elemente einzeln.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var fruits = new List<string> { "apple", "pear", "plum" };
Console.WriteLine(fruits.Count);
}
}Indizierung und Count
Greifen Sie wie bei einem Array über einen nullbasierten Index auf Elemente zu. list[0] ist das erste Element.
Verwenden Sie Count und nicht Length, um die Anzahl der Elemente in der Liste abzurufen. Das Lesen oder Schreiben über einen Index benötigt konstante Zeit, also O(1).
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var nums = new List<int> { 10, 20, 30 };
Console.WriteLine(nums[1]);
Console.WriteLine(nums.Count);
}
}Hinzufügen und Einfügen
Add hängt ein Element in amortisiertem O(1)-Aufwand am Ende an. Mit AddRange hängen Sie viele Elemente auf einmal an.
Insert(index, item) platziert ein Element an einer bestimmten Position und verschiebt alle nachfolgenden Elemente. Durch diese Verschiebung hat Insert am Anfang den Aufwand O(n). Wenn möglich, sollten Sie daher am Ende hinzufügen.
var list = new List<string> { "b", "c" };
list.Insert(0, "a");
list.AddRange(new[] { "d", "e" });
// list is now a, b, c, d, eElemente entfernen
Remove(item) löscht den ersten passenden Wert und gibt true zurück, wenn er gefunden wurde. RemoveAt(index) löscht ein Element anhand seiner Position.
Beide Methoden verschieben die nachfolgenden Elemente nach links, daher hat das Entfernen aus der Mitte den Aufwand O(n). RemoveAll nimmt ein Prädikat entgegen und entfernt alle passenden Elemente in einem Durchlauf.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var nums = new List<int> { 1, 2, 3, 4, 5 };
nums.RemoveAll(n => n % 2 == 0);
Console.WriteLine(string.Join(",", nums));
}
}Eine Liste durchsuchen
Contains teilt Ihnen mit, ob ein Wert vorhanden ist; IndexOf gibt seine Position oder -1 zurück. Beide Methoden durchsuchen die Liste linear mit dem Aufwand O(n).
Wenn Sie eine große Liste wiederholt nach Werten durchsuchen, summiert sich dieser lineare Aufwand. Ein HashSet oder Dictionary könnte besser geeignet sein.
var names = new List<string> { "Ann", "Bob", "Cy" };
bool hasBob = names.Contains("Bob"); // true
int pos = names.IndexOf("Cy"); // 2Iterieren
Eine foreach-Schleife ist die übersichtlichste Möglichkeit, jedes Element zu lesen. Sie können auch eine klassische for-Schleife verwenden, wenn Sie den Index benötigen.
Fügen Sie innerhalb einer foreach-Schleife über dieselbe Liste keine Elemente hinzu und entfernen Sie keine, da andernfalls eine InvalidOperationException ausgelöst wird.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var colors = new List<string> { "red", "green", "blue" };
foreach (var c in colors)
Console.WriteLine(c);
}
}Sortieren
Sort() sortiert die Liste direkt mithilfe des Standardvergleichers. Für eine benutzerdefinierte Reihenfolge übergeben Sie einen Vergleichsdelegaten.
Sortieren hat den Aufwand O(n log n). Um eine sortierte Kopie zu erhalten, ohne das Original zu ändern, verwenden Sie OrderBy von LINQ, das eine neue Sequenz zurückgibt.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var nums = new List<int> { 4, 1, 3, 2 };
nums.Sort();
Console.WriteLine(string.Join(",", nums));
}
}Capacity und Count
Count gibt an, wie viele Elemente vorhanden sind; Capacity gibt an, wie viele Elemente die Liste aufnehmen kann, bevor ihr internes Array neu angelegt werden muss.
Wenn die Liste über ihre Kapazität hinaus wächst, wird ein größeres Array angelegt und die Elemente werden kopiert, wobei sich die Größe ungefähr verdoppelt. Wenn Sie die endgültige Größe kennen, übergeben Sie sie an den Konstruktor, um wiederholte Kopiervorgänge zu vermeiden.
var list = new List<int>(1000); // reserve capacity
for (int i = 0; i < 1000; i++)
list.Add(i);
// no intermediate reallocationsEine Liste als Methodenargument
Eine List<T> ist ein Referenztyp. Wenn Sie sie an eine Methode übergeben, wird die Referenz übergeben, sodass Änderungen innerhalb der Methode die Liste des Aufrufers beeinflussen.
Wenn eine Methode nur liest, akzeptieren Sie IEnumerable<T> oder IReadOnlyList<T>, um zu signalisieren, dass Sie die Liste nicht ändern werden.
using System;
using System.Collections.Generic;
class Program {
static void AddOne(List<int> xs) => xs.Add(1);
static void Main() {
var nums = new List<int>();
AddOne(nums);
Console.WriteLine(nums.Count); // 1
}
}Konvertieren und Kopieren
ToArray() erstellt ein Array fester Größe; new List<T>(other) erstellt eine flache Kopie einer anderen Sequenz.
Eine flache Kopie dupliziert die Listenstruktur, verwendet aber weiterhin dieselben Elementreferenzen. Daher ist die Änderung eines enthaltenen Objekts über beide Listen sichtbar.
var original = new List<int> { 1, 2, 3 };
int[] arr = original.ToArray();
var copy = new List<int>(original);Schnelltest
Wählen Sie die Operation aus, deren Aufwand heraussticht.
Zusammenfassung
List<T> ist ein erweiterbares, typsicheres Array. Der Zugriff über einen Index und Count haben den Aufwand O(1); Add am Ende hat amortisiert den Aufwand O(1).
Einfügen, Entfernen und die Suche nach einem Wert in der Mitte haben aufgrund des Verschiebens oder Durchsuchens den Aufwand O(n). Reservieren Sie Kapazität, wenn die Größe bekannt ist, um Neuanlagen zu vermeiden.
Häufig gestellte Fragen
Ist die Lektion „Listen in der Praxis“ kostenlos?
Ja — der vollständige Text von „Listen in der Praxis“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Listen in der Praxis“?
Hinzufügen, entfernen und suchen. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Listen in der Praxis“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Listen in der Praxis
- Dictionary-Suchen
- HashSet und Eindeutigkeit
- Eine Collection auswählen