0Pricing
C# Academy · Lektion

Eine Collection auswählen

Abwägungen und Performance.

Eine Collection auswählen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Zuerst eine Frage

Die Auswahl einer Sammlung beginnt mit einer Frage: Wie greifen Sie auf die Daten zu? Über die Position, über einen Schlüssel oder möchten Sie lediglich prüfen, ob ein Element enthalten ist?

List, Dictionary und HashSet eignen sich jeweils für ein anderes Zugriffsmuster. Stimmen Sie das Werkzeug auf das Muster ab, bleibt Ihr Code schnell und übersichtlich.

Zugriff über Position: List

Wenn die Reihenfolge wichtig ist und Sie über den Index auf Elemente zugreifen, wählen Sie List<T>. Die Einfügereihenfolge bleibt erhalten und der Indexzugriff benötigt O(1).

Beispiele sind eine Abfolge von Schritten, Zeilen in Anzeigereihenfolge oder jede Sequenz, die Sie vom Anfang bis zum Ende durchlaufen. Duplikate sind erlaubt.

var steps = new List<string> { "mix", "bake", "cool" };
string first = steps[0]; // O(1) by index

Zugriff über Schlüssel: Dictionary

Wenn Sie Dinge über eine eindeutige Kennung nachschlagen, wählen Sie Dictionary<K,V>. Es ordnet Schlüssel in durchschnittlich O(1) Werten zu.

Beispiele sind die Zuordnung einer Benutzer-ID zu einem Benutzer, eines Ländercodes zu einem Namen oder eines Wortes zu seiner Anzahl. Der Schlüssel beantwortet die Frage „welches?“, der Wert enthält die Daten.

var users = new Dictionary<int, string> {
    [101] = "Ann",
    [102] = "Bob"
};
string name = users[101];

Zugehörigkeit und Eindeutigkeit: HashSet

Wenn es Ihnen nur darauf ankommt, ob ein Wert vorhanden ist, oder wenn Sie Duplikate ablehnen müssen, wählen Sie HashSet<T>. Contains benötigt durchschnittlich O(1).

Beispiele sind bereits besuchte URLs, zulässige Berechtigungen oder eindeutige Tags. Es gibt keinen zugeordneten Wert, sondern nur das Vorhandensein des Elements.

var visited = new HashSet<string>();
if (visited.Add(url)) {
    // first time seeing this url
}

Kostentabelle

Durchschnittliche Kosten: Die Indizierung in List benötigt O(1), Contains jedoch O(n). Das Nachschlagen in Dictionary und HashSet benötigt O(1).

List.Add am Ende benötigt amortisiert O(1); das Einfügen oder Entfernen in der Mitte benötigt O(n). Hinzufügen und Entfernen in Dictionary und HashSet benötigen durchschnittlich O(1).

// List:       index O(1),  Contains O(n)
// Dictionary: by-key O(1), no index
// HashSet:    Contains O(1), no value, no index

List.Contains ist ein Warnsignal

Wiederholte Aufrufe von list.Contains innerhalb einer Schleife sind eine O(n²)-Falle. Jede Prüfung durchläuft die gesamte Liste.

Wenn Prüfungen auf Zugehörigkeit überwiegen, wechseln Sie zu einem HashSet. Diese eine Änderung kann eine träge Schleife bei großen Datenmengen in eine sofortige Berechnung verwandeln.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var allow = new HashSet<int> { 2, 4, 6 };
        foreach (int n in new[] { 1, 2, 3, 4 })
            if (allow.Contains(n)) Console.Write(n + " ");
    }
}

Wenn Sie sowohl Schlüssel als auch Reihenfolge benötigen

Benötigen Sie einen Schlüsselzugriff, aber auch eine vorhersehbare Reihenfolge? Ein standardmäßiges Dictionary garantiert keine Reihenfolge.

Erwägen Sie, neben einem Dictionary für das Nachschlagen eine List für die Reihenfolge zu führen, oder verwenden Sie SortedDictionary<K,V> für Schlüssel in sortierter Reihenfolge mit Kosten von O(log n).

var sorted = new SortedDictionary<string, int>();
sorted["b"] = 2;
sorted["a"] = 1;
// enumerates a then b, in key order

Speicherkompromisse

Hash-basierte Sammlungen tauschen Speicher gegen Geschwindigkeit. Dictionary und HashSet verwalten interne Buckets und benötigen dadurch mehr Speicher als eine kompakte List oder ein Array.

Bei kleinen Sammlungen mit nur wenigen Elementen kann das Durchsuchen einer List tatsächlich ausreichen und weniger Speicher benötigen. Hashing lohnt sich bei großen Datenmengen.

Gegen Schnittstellen programmieren

Methodensignaturen sollten den am wenigsten spezifischen Typ verlangen, der funktioniert. Akzeptieren Sie zum Lesen IEnumerable<T>, für indizierte Lesezugriffe IReadOnlyList<T> und für den Schlüsselzugriff IDictionary<K,V>.

Dadurch entkoppeln Sie die Aufrufer von Ihrer konkreten Auswahl und können Implementierungen später austauschen, ohne Signaturen zu ändern.

int Sum(IEnumerable<int> values) {
    int total = 0;
    foreach (int v in values) total += v;
    return total;
}

Ein durchgängiges Beispiel

Beim Zählen eindeutiger Wörter in einem Text kommen zwei Sammlungen gemeinsam zum Einsatz. Ein HashSet verfolgt bereits gesehene Wörter, ein Dictionary zählt ihre Vorkommen.

Jede Sammlung erfüllt eine Aufgabe besonders gut: Das Set sorgt für Eindeutigkeit, das Dictionary ordnet jedem Wort seine Häufigkeit zu – beides mit durchschnittlich O(1) pro Operation.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var counts = new Dictionary<string, int>();
        foreach (var w in "a b a c b a".Split(' '))
            counts[w] = counts.GetValueOrDefault(w) + 1;
        Console.WriteLine(counts["a"]); // 3
    }
}

Entscheidungs-Checkliste

Fragen Sie in dieser Reihenfolge: Benötige ich eine Zuordnung von Schlüssel zu Wert? Verwenden Sie Dictionary. Benötige ich nur Eindeutigkeit oder eine Zugehörigkeitsprüfung? Verwenden Sie HashSet.

Benötige ich andernfalls Reihenfolge und Indexzugriff, möglicherweise mit Duplikaten? Verwenden Sie List. Diese kurze Checkliste deckt die meisten alltäglichen Fälle ab.

Kurzer Test

Wenden Sie die Entscheidungs-Checkliste auf einen konkreten Bedarf an.

Zusammenfassung

Wählen Sie nach dem Zugriffsmuster: List für geordnete, indexierte Sequenzen, Dictionary für die Zuordnung von Schlüssel zu Wert und HashSet für Eindeutigkeit und Zugehörigkeit.

Achten Sie auf Big-O: Vermeiden Sie List.Contains in zeitkritischen Schleifen, nutzen Sie O(1)-Hash-Nachschlagen und programmieren Sie gegen Schnittstellen, damit Ihre Wahl flexibel bleibt.

Häufig gestellte Fragen

Ist die Lektion „Eine Collection auswählen“ kostenlos?

Ja — der vollständige Text von „Eine Collection auswählen“ 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 „Eine Collection auswählen“?

Abwägungen und Performance. 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 4 von 4.

Wie lange dauert die Lektion „Eine Collection auswählen“?

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

  1. Listen in der Praxis
  2. Dictionary-Suchen
  3. HashSet und Eindeutigkeit
  4. Eine Collection auswählen
← Zurück zu C# Academy