Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

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");
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);
}
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";
}
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);
}
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.