Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

Schnelle Vergleiche mit der Hashtable


Im Programmieralltag wird man fast täglich mit Listen von Objekten konfrontiert. Machmal ist es aber nötig, dass ein Objekt nur ein einziges Mal zu einer Liste hinzugefügt werden darf, das Programm also zuvor prüfen muss, ob ein Objekt schon in der Auflistung vorhanden ist. Programmiertechnisch ist dies kein großer Aufwand, muss man doch nur jedes schon in der Liste vorhandene Objekt mit dem neu hinzuzufügenden vergleichen und abschließend das Objekt hinzufügen, sofern es noch nicht in der Liste ist.

List itemListe = new List();
string newEntry = "Hallo";

bool found = false;

foreach (string item in item)
{
   if (newEntry == item)
   {
      found = true;
      break;
   }
}

if (found == false)
{
   itemListe.Add(newEntry);
}


So ein Vergleich ist schnell und einfach zu programmieren, ist aber, vor allem bei Listen mit sehr vielen Objekten, eine nicht unerhebliche Leistungsbremse. Besser wäre eine Liste, die man "fragen" könnte ob sich ein bestimtes Objekt schon in ihr befindet. So eine Liste ist eine Hashtable im Namespace System.Collections.

Von Konzept hat kann man eine Hashtable wie eine Tabelle mit zwei Spalten verstehen, einem Schlüssel (key) und einem Wert (value). Durch die Methoden ContainsKey beziehungsweise ContainsValue lässt sich direkt abfragen, ob ein Schlüssel oder Wert in der Hashtable vorhanden sind. Für dieses Beispiel machen wir uns den Umstand zu nutze, dass Schlüssel und Wert durchaus das gleiche Objekt sein können.

List itemListe = new List();

Hashtable hs = new Hashtable();
string newEntry = "Hallo";

if (hs.ContainsKey(newEntry) == false)
{
   hs.Add(newEntry, newEntry);
   itemListe.Add(newEntry);
}


Dies ist nicht nur viel weniger Programmcode, auch arbeitet dieses Programm erheblich schneller, als ein Vergleich in einer for-Schleife, denn eine Hashtable hat eigene Mechanismen, um nach einem Objekt zu suchen.

Ob man weiterhin eine Liste und zusätzlich eine Hashtable benötigt, wird sicher von Fall zu Fall entschieden werden müssen. Prinzipiell ist aber auch die Hashtable eine Auflistung von Objekten die man abrufen kann.

foreach (DictionaryEntry de in hs)
{
   MessageBox.Show(de.Key.ToString() +" "+ de.Value.ToString());
}


Allerdings darf man nicht vergessen, dass die Elemente einer Hashtable vom Type Object sind. Will man wieder an die ursprünglichen Datentypen, muss man die Objekte konvertieren (casten).