Utilizzo di Hashtable e Dictionary in C #

Microsoft .Net Framework fornisce un eccellente supporto per lavorare con le raccolte. Le raccolte vengono utilizzate per l'archiviazione e il recupero dei dati. Puoi utilizzare le raccolte nell'applicazione per allocare la memoria in modo dinamico per archiviare gli elementi e quindi recuperarli utilizzando la chiave o l'indice come e quando necessario. Fondamentalmente, una raccolta rappresenta un insieme di oggetti a cui è possibile accedere iterando ciascuno degli elementi della raccolta.

Hashtable

I tipi nello spazio dei nomi System.Collections archiviano i dati come oggetti di tipo Object. Hashtable rappresenta una struttura di dati che può memorizzare oggetti come coppie di valori chiave. Puoi cercare un valore in un'istanza della classe Hashtable utilizzando la chiave corrispondente. Si noti che sia la chiave che il valore archiviati in un'istanza di Hashtable sono di tipo oggetto. Notare che la chiave non può essere nulla. È comunque possibile memorizzare un valore nullo. Il seguente elenco di codice illustra come archiviare e recuperare chiave / valori da un'istanza di Hashtable.

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();

       }

È inoltre possibile sfruttare il metodo GetEnumerator () della classe Hashtable e quindi enumerare la raccolta per recuperare le coppie chiave / valore in essa memorizzate. Ecco uno snippet di codice che lo illustra.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator();

while (enumerator.MoveNext())

{

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

}

Puoi anche sfruttare la classe DictionaryEntry per iterare gli elementi in un Hashtable. Il frammento di codice seguente illustra come eseguire questa operazione.

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());

}

La ricerca di un elemento in un Hashtable è più veloce rispetto ad altre raccolte non generiche: capiamo perché. Un record in una tabella hash in bucket (ogni bucket può contenere più record) utilizzando chiavi hash. La chiave hash viene a sua volta generata automaticamente utilizzando un algoritmo di hashing. L'MSDN afferma: "Quando un elemento viene aggiunto a Hashtable, l'elemento viene inserito in un bucket in base al codice hash della chiave. Le ricerche successive della chiave utilizzano il codice hash della chiave per cercare in un solo bucket particolare, riducendo così sostanzialmente il numero di confronti chiave richiesti per trovare un elemento. "

Dizionario

Alcune delle classi più importanti nel namsepace System.Collections.Generic includono: List, Queue, HashSet, LinkedList, Stack, LinkedListNode e Dictionary. La classe Dictionary in C # rappresenta una struttura dati generica che può contenere chiavi e valori di dati. Quindi, puoi memorizzare dati di qualsiasi tipo in un'istanza di Dictionary.

Si noti che mentre l'interfaccia ICollection estende l'interfaccia IEnumerable, entrambe le interfacce IDictionary e IList estendono l'interfaccia ICollection. La classe Dictionary è contenuta nello spazio dei nomi System.Collections.Generic. In sostanza, un dizionario contiene una raccolta generica di coppie chiave / valore. È possibile sfruttare il metodo Add della classe Dictionary per archiviare oggetti in un'istanza di Dictionary. Un dizionario è più veloce di un hashtable in quanto elimina le spese generali di boxe e un-boxing.

Il frammento di codice seguente mostra come archiviare e recuperare oggetti all'interno di un'istanza di Dictionary.

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());

}

La differenza fondamentale tra Hashtable e Dictionary è che mentre il primo non è digitato e richiede un overhead di boxe e un-boxing, il secondo non lo fa mentre viene digitato. C'è un'altra differenza tra loro. Se utilizzi un indicizzatore per recuperare un valore da un'istanza di Hashtable e l'elemento non esiste, ti verrà restituito un valore nullo. Al contrario, se provi a recuperare un elemento inesistente da un'istanza di Dictionary, verrà generata un'eccezione. Si noti che né Hashtable né Dictionary garantiranno di preservare l'ordine degli elementi nella raccolta.

Mentre l'Hashtable è una struttura dati di tipo debole, un Dictionary è una struttura fortemente tipizzata. La scelta tra Hashtable e Dictionary dipende dalla necessità di una raccolta indipendente dai tipi. Nella maggior parte dei casi, un dizionario è una buona scelta. Per dirla semplicemente, un dizionario è un Hashtable migliorato. Uso spesso Dictionary su un hashtable.