Dictionaries in C#: Warum sind sie wichtig und wie arbeitet man mit ihnen?
Stellen Sie sich vor, Sie sind Bibliothekar. Sie haben Tausende von Büchern und müssen in Sekundenschnelle ein bestimmtes finden. Würden Sie alle Bücher der Reihe nach durchgehen? Nein, Sie würden einen Katalog verwenden. Ein Dictionary in C# ist genau so ein Katalog. Es speichert Schlüssel-Wert-Paare und ermöglicht den sofortigen Zugriff auf Daten über den Schlüssel.
Aber was tun, wenn Sie nicht einen einzelnen Eintrag finden, sondern den gesamten Inhalt eines Dictionaries verarbeiten müssen? Zum Beispiel alle Anwendungseinstellungen ausgeben, die Summe in einem Online-Shop-Warenkorb berechnen oder Daten in JSON serialisieren. Dann stellt sich die klassische Frage: "How to iterate over a dictionary?".
Auf Stack Overflow hat diese Frage Tausende von Aufrufen. Und das zu Recht: Es scheint einfach, aber Anfänger stolpern oft über Datentypen, während Profis über die Leistung nachdenken. In diesem Artikel werden wir alle Möglichkeiten der Iteration über ein Dictionary in C# behandeln: von einfachem foreach bis hin zu fortgeschrittenem LINQ. Los geht's!
1. Grundlagen: Die Struktur von Dictionary in C#
Bevor wir iterieren, erinnern wir uns daran, wie ein C# Dictionary aussieht. Es ist eine generische Sammlung aus dem Namespace System.Collections.Generic.
Dictionary<string, int> ages = new Dictionary<string, int>(){ { "Anna", 25 }, { "Boris", 30 }, { "Viktor", 35 }};Jedes Element eines Dictionaries ist eine Struktur KeyValuePair<TKey, TValue>. Sie hat zwei Eigenschaften: Key und Value. Mit diesem Paar arbeiten wir beim Durchlaufen.
2. Der Klassiker: foreach über ein Dictionary
Die gebräuchlichste Methode zur Iteration über ein Dictionary in C# ist die foreach-Schleife. Sie ist prägnant, lesbar und sicher.
foreach (KeyValuePair<string, int> kvp in ages){ Console.WriteLine($"{kvp.Key}: {kvp.Value} Jahre");}Ausgabe:
Anna: 25 JahreBoris: 30 JahreViktor: 35 JahreBeachten Sie: kvp ist ein KeyValuePair. Versuchen Sie nicht, den Schlüssel oder Wert innerhalb der Schleife zu ändern – das Dictionary würde inkonsistent werden und Sie erhalten eine InvalidOperationException.
Profi-Tipp: Wenn Sie den vollständigen Typ nicht ausschreiben möchten, verwenden Sie var:
foreach (var kvp in ages) { ... }3. Nur Schlüssel oder nur Werte
Manchmal benötigen wir nicht das gesamte Paar. Zum Beispiel, um nur eine Liste aller Schlüssel (Namen) oder aller Werte (Alter) auszugeben. Dafür hat das Dictionary die Eigenschaften Keys und Values.
Iteration über Schlüssel
foreach (string name in ages.Keys){ Console.WriteLine($"Name: {name}");}Iteration über Werte
foreach (int age in ages.Values){ Console.WriteLine($"Alter: {age}");}Dies ist schneller als das Abrufen eines KeyValuePair, wenn Sie den anderen Teil nicht benötigen. Außerdem wird der Code sauberer.
4. Indexzugriff: for und ElementAt
Viele Anfänger versuchen, for (int i = 0; i < dict.Count; i++) zu verwenden. Aber ein Dictionary in C# unterstützt keinen Indexer nach Nummer! Der Versuch, dict[i] zu schreiben, führt zu einem Kompilierungsfehler.
Man kann jedoch einen Umweg gehen: Die Sammlung von Paaren über .ToList() abrufen und dann über den Index darauf zugreifen.
var list = ages.ToList();for (int i = 0; i < list.Count; i++){ Console.WriteLine($"{list[i].Key}: {list[i].Value}");}Nachteile:
- Es wird eine zusätzliche Kopie der Daten erstellt (Speicher + Zeit).
- Der Sinn des Dictionaries als assoziatives Array geht verloren.
Diese Methode sollte nur verwendet werden, wenn Sie unbedingt einen Index benötigen (z. B. für die parallele Verarbeitung mit Aufteilung in Teile).