TOC

This article has been localized into German by the community.

Sammlungen:

Wörterbuch (dictionary)

Dictionaries in C# implementieren alle die Schnittstelle IDictionary. Es gibt mehrere Dictionary-Typen, aber der am häufigsten verwendete ist das generische Dictionary, das oft als Dictionary<TKey, TValue> bezeichnet wird - es enthält einen typspezifischen Schlüssel und einen entsprechenden typspezifischen Wert. Dies unterscheidet ein Dictionary im Wesentlichen von einer Liste - die Elemente einer Liste kommen in einer bestimmten Reihenfolge und können über einen numerischen Index abgerufen werden, während Elemente in einem Dictionary mit einem eindeutigen Schlüssel gespeichert werden, mit dem das Element dann wieder abgerufen werden kann.

Wir werden mehr darüber lernen, worum es bei Wörterbüchern geht, aber zuerst wollen wir uns ein einfaches Beispiel ansehen, um Ihnen zu zeigen, worum es geht:

Dictionary<string, int> users = new Dictionary<string, int>();  
users.Add("John Doe", 42);  
users.Add("Jane Doe", 38);  
users.Add("Joe Doe", 12);  
users.Add("Jenna Doe", 12);

Console.WriteLine("John Doe is " + users["John Doe"] + " years old");

Treffen Sie die Doe-Familie, die wiederum die Testdaten für ein Beispiel in diesem Tutorial sind. Papa, Mama und die Zwillinge Joe und Jenna. Beachten Sie, wie ich das Dictionary so definiere, dass es eine Zeichenkette als Schlüssel (in diesem Fall den Namen) und eine Ganzzahl für den Wert (in diesem Fall ein Alter) verwendet. Die coole Sache ist, dass dies uns ermöglicht auf einen Gegenstand aus dem Wörterbuch mit dem Schlüssel (Name), anstelle eines numerischen Index zuzugreifen. Sie können das in Aktion in der letzten Zeile des Beispiels sehen - zwischen einer Reihe von eckigen Klammern geben wir einfach den Schlüssel an, um auf den Wert (das Alter) zuzugreifen.

Hier sind zwei wichtige Dinge zu beachten: Erstens muss der Schlüssel einzigartig sein. In diesem Fall, in dem wir eine Zeichenfolge als Schlüssel verwenden, können Sie nicht zwei Benutzer mit exakt demselben Namen hinzufügen. Das ist ziemlich sinnvoll, denn wenn Sie den Schlüssel verwenden, um auf ein einzelnes Objekt zu verweisen, kann der Schlüssel nur auf einen Wert zeigen. Auf der anderen Seite macht es dieses Beispiel ein bisschen zu einfach, weil Sie offensichtlich keine Sammlung von Benutzern haben können, wo doppelte Namen nicht existieren können, aber lassen Sie uns das vorerst gemeinsam ertragen.

Die andere Sache, an die Sie sich beim Zugriff auf Werte aus einem Wörterbuch erinnern müssen, ist, dass der Schlüssel in der Sammlung vorhanden sein muss, wenn Sie versuchen, auf seinen Wert zuzugreifen. Mit anderen Worten, mein Beispiel war nur sicher, weil ich die volle Kontrolle darüber hatte, was die Liste enthielt - in den meisten Situationen sollten Sie immer überprüfen, ob der Schlüssel existiert, bevor Sie versuchen, ihn zu benutzen - so:

string key = "John Doe";
if(users.ContainsKey(key))
    Console.WriteLine("John Doe is " + users[key] + " years old");

Wenn Sie versuchen, einen Schlüssel hinzuzufügen, der bereits existiert, oder wenn Sie versuchen, auf einen Wert mit einem Schlüssel zuzugreifen, der nicht existiert, löst .NET eine Ausnahme aus. Dies mag offensichtlich erscheinen, aber beide sind tatsächlich sehr häufig in den Ausnahmeprotokollen auf der ganzen Welt zu finden.

Arbeiten mit Elementen

Der Zugriff auf ein einzelnes Objekt kann sehr nützlich sein, aber was ist, wenn Sie in der Sammlung z.B.: nach etwas suchen? In diesem Fall sollten Sie als Erstes wissen, dass die Elemente in der Liste offensichtlich nicht nur ein einfaches Objekt sind, sondern dass das Wörterbuch Elemente des Typs KeyValuePair<TKey,TValue> enthält. Die Ts sind die Typen, die Sie zum Deklarieren der Liste verwendet haben - in diesem Fall eine Zeichenfolge und eine Ganzzahl. Das Durchlaufen der Sammlung mit einer foreach -Schleife würde also ungefähr so aussehen:

Dictionary<string, int> users = new Dictionary<string, int>()
{
    { "John Doe", 42 },
    { "Jane Doe", 38 },
    { "Joe Doe", 12 },
    { "Jenna Doe", 12 }
};
foreach (KeyValuePair<string, int> user in users)
{
    Console.WriteLine(user.Key + " is " + user.Value + " years old");
}

Das erste, was Sie bemerken können, ist, dass ich die Möglichkeit genutzt habe, die Art und Weise zu ändern, wie wir das Wörterbuch initialisieren. Anstatt jedes Element nach dem Instanziieren des Wörterbuchs manuell hinzuzufügen, verwenden wir die Syntax der Auflistungsinitialisierung, wie in einem früheren Artikel beschrieben.

Damit haben wir jetzt das gleiche Wörterbuch wie zuvor - lasst es uns durchgehen. Wie Sie sehen können, verwende ich eine "foreach" -Schleife und habe den Typ des Elements, das ich erwarte, als KeyValuePair<string,int> - genau die gleichen zwei Typen, die verwendet wurden, um das Wörterbuch zu deklarieren. Jetzt können wir für jedes Element sowohl auf den Schlüssel als auch auf den Wert (Name und Alter) zugreifen und daraus eine einfache Reihe von Informationen über die Person für die Konsole generieren.

Die Reihenfolge der Elemente

Das obige Beispiel bringt uns zu einem sehr wichtigen Punkt: Im Gegensatz zu einer Liste, bei der die Reihenfolge der Elemente durch numerische Indizes bestimmt wird, ist die Reihenfolge der Elemente in einem Wörterbuch nicht deterministisch - Sie können sich einfach nicht auf die Elemente verlassen die in einer bestimmten Reihenfolge sind, nicht einmal, wenn Sie jedes Element einzeln manuell hinzufügen. Sicher, wenn Sie das obige Beispiel ausführen, werden Sie wahrscheinlich feststellen, dass die Elemente in der gleichen Reihenfolge wie wir sie hinzugefügt haben, aber das ist nicht garantiert und sobald Sie ein Wörterbuch mit mehr Elementen haben und Sie das Hinzufügen und Entfernen von Elementen starten, wird sich die Reihenfolge wahrscheinlich ändern.

Die "Dictionary" -Klasse verfügt nicht über eine Sort() -Methode, da die Reihenfolge am Ende geändert werden kann, sobald Sie mit der Arbeit beginnen. Stattdessen können Sie die Methoden OrderBy() und OrderByDescending() von LINQ (mehr dazu in einem anderen Kapitel) verwenden, um eine sortierte Kopie des Dictionary zu erhalten. Dies ermöglicht Ihnen auch, entweder nach dem Schlüssel oder nach dem Wert zu sortieren, was in unserem Beispiel nützlich sein könnte, um die Benutzer in der Reihenfolge ihres Alters zu erhalten:

Dictionary<string, int> users = new Dictionary<string, int>()
{
    { "John Doe", 42 },
    { "Jane Doe", 38 },
    { "Joe Doe", 12 },
    { "Jenna Doe", 12 }
};
foreach (KeyValuePair<string, int> user in users.OrderBy(user => user.Value))
{
    Console.WriteLine(user.Key + " is " + user.Value + " years old");
}

Wenn Sie das Beispiel ausführen, werden Sie sehen, dass obwohl das Wörterbuch mit den Artikeln in einer Bestellung deklariert ist, wir sie leicht in einer anderen Reihenfolge herausholen können, wie wir es für richtig halten. Denken Sie daran, dass Sie dafür verantwortlich sind, dass Sie die Elemente in der von Ihnen gewünschten Reihenfolge erhalten, da das .NET-Framework sie genau so speichert, wie sie es für richtig halten.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!