Arbeiten mit Hashtable und Dictionary in C #

Microsoft .Net Framework bietet hervorragende Unterstützung für die Arbeit mit Sammlungen. Sammlungen werden zum Speichern und Abrufen von Daten verwendet. Sie verwenden Sammlungen in Ihrer Anwendung, um Speicher dynamisch zuzuweisen, um Elemente zu speichern, und sie dann bei Bedarf mithilfe von Schlüssel oder Index abzurufen. Grundsätzlich stellt eine Sammlung eine Reihe von Objekten dar, auf die Sie zugreifen können, indem Sie jedes der Elemente der Sammlung iterieren.

Hash-tabelle

Die Typen im System.Collections-Namespace speichern Daten als Objekte vom Typ Object. Hashtable stellt eine Datenstruktur dar, in der Objekte als Schlüsselwertpaare gespeichert werden können. Sie können mit dem entsprechenden Schlüssel nach einem Wert in einer Instanz der Hashtable-Klasse suchen. Beachten Sie, dass sowohl der Schlüssel als auch der Wert, der in einer Hashtable-Instanz gespeichert ist, vom Objekttyp sind. Beachten Sie, dass der Schlüssel nicht null sein darf. Sie können trotzdem einen Nullwert speichern lassen. Die folgende Codeliste zeigt, wie Sie Schlüssel / Werte aus einer Hashtable-Instanz speichern und abrufen können.

static void Main()

       {

           Hashtable hashTable = new Hashtable();

           hashTable.Add(1, "Joydip");

           hashTable.Add(2, "James");

           hashTable.Add(3, "Steve");

           Console.WriteLine("The key / value pairs are:--");

           foreach (int key in hashTable.Keys)

           {

               Console.WriteLine("Key: "+ key + " Value: "+ hashTable[key].ToString());

           }

           Console.Read();

       }

Sie können auch die GetEnumerator () -Methode der Hashtable-Klasse nutzen und dann die Auflistung auflisten, um die darin gespeicherten Schlüssel / Wert-Paare abzurufen. Hier ist ein Codefragment, das dies veranschaulicht.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator();

while (enumerator.MoveNext())

{

Console.WriteLine("Key: " + enumerator.Key.ToString() + " Value: " + enumerator.Value.ToString());

}

Sie können auch die DictionaryEntry-Klasse nutzen, um die Elemente in einer Hashtable zu iterieren. Das folgende Codefragment zeigt, wie dies getan werden kann.

Hashtable hashTable = new Hashtable();

hashTable.Add(1, "Joydip");

hashTable.Add(2, "James");

hashTable.Add(3, "Steve");

foreach (DictionaryEntry dictionaryEntry in hashTable)

{

   Console.WriteLine("Key: " + dictionaryEntry.Key.ToString() + " Value: " + dictionaryEntry.Value.ToString());

}

Das Durchsuchen eines Elements in einer Hashtabelle ist im Vergleich zu anderen nicht generischen Sammlungen schneller - lassen Sie uns verstehen, warum. Ein Datensatz in einer Hashtabelle in Buckets (jeder Bucket kann mehrere Datensätze enthalten) unter Verwendung von Hash-Schlüsseln. Der Hash-Schlüssel wird wiederum automatisch mithilfe eines Hashing-Algorithmus generiert. In der MSDN heißt es: "Wenn ein Element zur Hashtabelle hinzugefügt wird, wird das Element basierend auf dem Hash-Code des Schlüssels in einen Bucket gestellt. Nachfolgende Suchvorgänge des Schlüssels verwenden den Hash-Code des Schlüssels, um nur in einem bestimmten Bucket zu suchen. Dadurch wird die Anzahl der Schlüsselvergleiche, die zum Auffinden eines Elements erforderlich sind, erheblich reduziert. "

Wörterbuch

Einige der wichtigen Klassen im System.Collections.Generic-Namespace sind: List, Queue, HashSet, LinkedList, Stack, LinkedListNode und Dictionary. Die Dictionary-Klasse in C # stellt eine generische Datenstruktur dar, die Schlüssel und Werte von Daten enthalten kann. Daher können Sie Daten eines beliebigen Typs in einer Dictionary-Instanz speichern.

Beachten Sie, dass während die ICollection-Schnittstelle die IEnumerable-Schnittstelle erweitert, sowohl die IDictionary- als auch die IList-Schnittstelle die ICollection-Schnittstelle erweitern. Die Dictionary-Klasse ist im System.Collections.Generic-Namespace enthalten. Im Wesentlichen enthält ein Wörterbuch eine generische Sammlung von Schlüssel / Wert-Paaren. Sie können die Add-Methode der Dictionary-Klasse verwenden, um Objekte in einer Dictionary-Instanz zu speichern. Ein Wörterbuch ist schneller als eine Hashtabelle, da der Aufwand für das Ein- und Auspacken entfällt.

Das folgende Codefragment zeigt, wie Sie Objekte in einer Dictionary-Instanz speichern und abrufen können.

Dictionary dictionary = new Dictionary();

dictionary.Add(1, "Joydip");

dictionary.Add(2, "James");

dictionary.Add(3, "Steve");

foreach (KeyValuePair kvp in dictionary)

{

Console.WriteLine(kvp.Key.ToString() + " - " + kvp.Value.ToString());

}

Der grundlegende Unterschied zwischen einer Hashtabelle und einem Wörterbuch besteht darin, dass das erstere nicht typisiert ist und Box- und Unboxing-Overhead erfordert, das letztere jedoch nicht so, wie es eingegeben wird. Es gibt einen weiteren Unterschied zwischen ihnen. Wenn Sie einen Indexer verwenden, um einen Wert aus einer Hashtable-Instanz abzurufen, und das Element nicht vorhanden ist, wird ein Nullwert zurückgegeben. Im Gegenteil, wenn Sie versuchen, ein nicht vorhandenes Element aus einer Dictionary-Instanz abzurufen, wird eine Ausnahme ausgelöst. Beachten Sie, dass weder Hashtable noch Dictionary die Beibehaltung der Reihenfolge der Elemente in der Sammlung garantieren.

Während die Hashtabelle eine schwach typisierte Datenstruktur ist, ist ein Wörterbuch eine stark typisierte. Die Wahl zwischen einer Hashtabelle und einem Wörterbuch hängt davon ab, ob Sie eine typsichere Sammlung benötigen. In den meisten Fällen ist ein Wörterbuch eine gute Wahl. Einfach ausgedrückt ist ein Wörterbuch eine verbesserte Hashtabelle. Ich benutze Dictionary häufig über eine Hashtable.