Dictionary-Suchen
Schneller Zugriff über Schlüssel und Werte.
Dictionary-Suchen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.
Schlüssel-Wert-Paare
Dictionary<TKey, TValue> ordnet eindeutigen Schlüsseln Werte zu. Stellen Sie es sich als Nachschlagetabelle vor: Sie übergeben einen Schlüssel und erhalten schnell den zugehörigen Wert zurück.
Es basiert auf einer Hashtabelle. Daher erfolgt das Finden eines Werts anhand seines Schlüssels durchschnittlich mit dem Aufwand O(1), also deutlich schneller als das Durchsuchen einer Liste.
using System.Collections.Generic;
var ages = new Dictionary<string, int>();
ages["Ann"] = 30;
ages["Bob"] = 25;Ein Dictionary initialisieren
Sie können ein Dictionary mit einem Collection-Initializer vorinitialisieren. Jeder Eintrag verbindet einen Schlüssel mit seinem Wert.
Schlüssel müssen eindeutig sein. Wenn Sie denselben Schlüssel in einem Initializer zweimal angeben, wird zur Laufzeit eine ArgumentException ausgelöst.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var caps = new Dictionary<string, string> {
["FR"] = "Paris",
["JP"] = "Tokyo"
};
Console.WriteLine(caps["JP"]);
}
}Lesen per Schlüssel
Verwenden Sie den Indexer zum Lesen: dict[key]. Dies ist im Durchschnitt O(1).
Beachten Sie jedoch: Wenn der Schlüssel fehlt, löst der Indexer KeyNotFoundException aus. Das Lesen eines nicht vorhandenen Schlüssels ist einer der häufigsten Fehler im Umgang mit Dictionaries.
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
int a = ages["Ann"]; // 30
// int b = ages["Zoe"]; // throws KeyNotFoundExceptionSicheres Nachschlagen mit TryGetValue
TryGetValue vermeidet Ausnahmen. Es gibt true zurück und setzt eine out-Variable, wenn der Schlüssel vorhanden ist, andernfalls false.
Dies ist der idiomatische Weg ohne Speicherallokationen, um einen möglicherweise nicht vorhandenen Wert nachzuschlagen.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.TryGetValue("Ann", out int v))
Console.WriteLine(v);
}
}ContainsKey und Standardwerte
ContainsKey prüft, ob ein Schlüssel vorhanden ist, ohne den Wert zu lesen, und benötigt dafür O(1). Verwenden Sie es vor dem Lesen über den Indexer, wenn Sie nur eine Ja- oder Nein-Antwort benötigen.
Wenn Sie sowohl ContainsKey als auch den Indexer verwenden, hashen Sie den Schlüssel zweimal. TryGetValue erledigt das einmal und ist daher normalerweise schneller.
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.ContainsKey("Ann"))
System.Console.WriteLine(ages["Ann"]);Hinzufügen vs. Zuweisen
Der Indexer dict[key] = value fügt ein neues Paar ein oder überschreibt ein vorhandenes. Add(key, value) fügt nur ein Paar ein und löst eine Ausnahme aus, wenn der Schlüssel bereits vorhanden ist.
Verwenden Sie Add, wenn ein doppelter Schlüssel ein Fehler sein soll, und den Indexer, wenn Überschreiben in Ordnung ist.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var d = new Dictionary<string, int>();
d["x"] = 1;
d["x"] = 2; // overwrite, fine
Console.WriteLine(d["x"]);
}
}Einträge entfernen
Remove(key) löscht ein Paar und gibt true zurück, wenn der Schlüssel vorhanden war; im Durchschnitt benötigt der Vorgang O(1).
Eine Überladung gibt den entfernten Wert über einen out-Parameter zurück – praktisch, wenn Sie den Wert in einem Schritt löschen und anschließend verwenden möchten.
var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
bool removed = d.Remove("a"); // true
bool again = d.Remove("a"); // falsePaare durchlaufen
Beim Durchlaufen werden Elemente vom Typ KeyValuePair<TKey, TValue> geliefert. Zerlegen Sie sie in einen Schlüssel und einen Wert, um übersichtlichen Code zu schreiben.
Die Reihenfolge der Enumeration ist nicht garantiert. Verlassen Sie sich niemals auf die Reihenfolge, in der Einträge eingefügt wurden. Verwenden Sie Keys oder Values, um nur eine Seite zu durchlaufen.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
foreach (var (key, val) in d)
Console.WriteLine($"{key}={val}");
}
}Mit einem Dictionary zählen
Eine klassische Anwendung ist das Zählen von Vorkommen. Erhöhen Sie für jedes Element dessen Anzahl und beginnen Sie bei einem neuen Element mit null.
Dieses Muster läuft für n Elemente in O(n), da jedes Nachschlagen und Aktualisieren O(1) benötigt – im Gegensatz zu O(n²), wenn Sie jedes Mal eine Liste durchsuchen würden.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var counts = new Dictionary<char, int>();
foreach (char c in "banana")
counts[c] = counts.GetValueOrDefault(c) + 1;
Console.WriteLine(counts['a']);
}
}Die Gleichheit von Schlüsseln ist wichtig
Das Nachschlagen basiert auf GetHashCode und Equals des Schlüsseltyps. Integrierte Typen und string funktionieren ohne weitere Konfiguration.
Bei Schlüsseln aus benutzerdefinierten Klassen überschreiben Sie beide Methoden oder verwenden Sie ein record. Andernfalls werden zwei gleich aussehende Schlüssel unterschiedlich gehasht und Nachschlagevorgänge schlagen fehl.
var byName = new Dictionary<string, int>(
System.StringComparer.OrdinalIgnoreCase);
byName["Hi"] = 1;
bool found = byName.ContainsKey("HI"); // trueWerttyp auswählen
Werte können beliebige Typen haben, auch Listen. Ein Dictionary<string, List<int>> gruppiert viele Werte unter einem Schlüssel.
Erstellen Sie beim Einfügen in eine solche Struktur die innere Liste bei der ersten Verwendung und fügen Sie anschließend das Element hinzu. So entsteht eine gruppierte Map mit mehreren Werten pro Schlüssel.
var groups = new Dictionary<string, List<int>>();
void Add(string k, int v) {
if (!groups.TryGetValue(k, out var list))
groups[k] = list = new List<int>();
list.Add(v);
}Kurzer Test
Wählen Sie die sicherste Methode, einen möglicherweise fehlenden Schlüssel zu lesen.
Zusammenfassung
Dictionary<K,V> ermöglicht durchschnittlich O(1) für das Nachschlagen, Einfügen und Entfernen über Schlüssel und basiert dabei auf einer Hashtabelle.
Bevorzugen Sie TryGetValue gegenüber dem Indexer, der Ausnahmen auslöst, halten Sie Schlüssel eindeutig und stellen Sie sicher, dass benutzerdefinierte Schlüsseltypen eine korrekte Gleichheit und Hashbildung implementieren. Die Reihenfolge der Enumeration ist nicht definiert.
Häufig gestellte Fragen
Ist die Lektion „Dictionary-Suchen“ kostenlos?
Ja — der vollständige Text von „Dictionary-Suchen“ 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 „Dictionary-Suchen“?
Schneller Zugriff über Schlüssel und Werte. 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 2 von 4.
Wie lange dauert die Lektion „Dictionary-Suchen“?
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.