Dictionary = generische Liste hoch Zwei
Im Gegensatz zur generischen Liste besteht ein Dictionary immer aus einem Wertepaar, oder um präziser zu sein, einem Schlüssel und einem Wert. Welchem Datentyp Schlüssel und Wert angehören, ist dabei nicht von Bedeutung, so sind beispielsweise Dictionary aus strings keine Seltenheit.
Dictionary
myStringDict = new Dictionary();
Auch Dictionary aus
selbst definierten Klassen sind natürlich möglich,
wie im folgenden Beispiel aus der Klasse
"person".
Dictionary
myPersonenDict = new Dictionary();
Genau wie bei der
generischen Liste werden auch beim Dictionary neue
Elemente durch "Add" angehängt.
myStringDict.Add("10001",
"Müller");
myStringDict.Add("10002", "Meier");
myStringDict.Add("10002", "Meier");
Der große Unterschied
zu Listen ist aber, das Dictionary intern mit einer
Hashtabelle arbeiten. Dies ermöglicht einen sehr
schnellen Zugriff auf den Wert über den Schlüssel,
erfordert aber auch, das der Schlüssel einmalig im
Dictionary ist. Die Abfrage eine Wertes über die
Schlüssel ist sehr simpel:
MessageBox.Show(myStringDict["10001"]);
Hier sollte man
allerdings mit Vorsicht zu Werke gehen, denn eine
Abfrage auf einen nicht vorhandenen Schlüssel führt
unweigerlich zu einem Fehler, genauer gesagt zu
einer KeyNotFoundException. Eine sicherer Technik
ist daher der Gebrauch von „TryGetValue“. Diese
Methode arbeitet mit der out-Referenz in der für
einen angefragten Schlüssel der Wert zurückgegeben
wird. Der eigendliche Rückgabewert der Methode ist
ein boolscher Wert der angibt, ob ein Schlüssel im
Dictionary gefunden wurde. In der Praxis könnte das
zum Beispiel so aussehen:
string
wert ="";
bool contains = false;
contains = myStringDict.TryGetValue("10006", out wert);
if (contains == true)
{
MessageBox.Show(wert);
}
bool contains = false;
contains = myStringDict.TryGetValue("10006", out wert);
if (contains == true)
{
MessageBox.Show(wert);
}
Die Änderung eines
Werte über den Schlüssel ist durch eine einfache
Zuweisung möglich.
myStringDict["10001"]
= "Schmidt";
Auch hier sollte man
mit großer Sorgfalt arbeiten, denn die Zuweisung
eines Wertes zu einem nicht vorhandenen Schlüssel
bringt in diesem Fall keinen Fehler sondern erzeugt
schlicht und einfach ein neues Wertepaar im
Dictionary. Das kann gewollt sein, kann aber auch
durch einen einfachen Schreibfehler verursacht
werden. Um soche Gefahrenquellen zu vermeiden
sollte man prüfen, ob bestimmte Schlüssel überhaupt
im Dictionary enthalten sind.
if(myStringDict.ContainsKey("10001")
== true)
{
myStringDict["10001"] = "Schmidt";
}
{
myStringDict["10001"] = "Schmidt";
}
Etwas
gewöhnungsbedürftig ist es allerdings, wenn man mit
einer foreach-Schleife auf die Elemente eine
Dictionary zugreifen will. Das von der generischen
Liste bekannte Prinzip.
foreach
(Dictionary wertepaar in myStringDict)
Die Schleife
funktioniert hier allerdings nicht! Statt dessen
kommt hier ein KeyValuePair zum Einsatz. Diese
Struktur bietet vereinfachten Zugriff auf Schlüssel
und Wert.
foreach
(KeyValuePair <string,string> wertepaar in
myStringDict)
{
MessageBox.Show(wertepaar.Key);
MessageBox.Show(wertepaar.Value);
}
{
MessageBox.Show(wertepaar.Key);
MessageBox.Show(wertepaar.Value);
}
Wir sehen also, dass
man Dictionary durchaus als Abwandlung eine
generischen Liste betrachten kann. Natürlich gibt
es Einschränkungen, da wir nur einen Wert und einen
Schlüssel, der noch dazu einmalig sein muss,
benutzen können. Sind aber diese Bedingungen
gegeben sollte man durchaus einem Dictionary den
Vorzug geben da es verbesserten Zugriff auf
Elemente ermöglicht.