Differenza tra Dizionario e Hashtable

Possibile duplicato:
Perché il dizionario è preferito su hashtable in C #?

Qual è la differenza tra Dizionario e Hashtable. Come decidere quale usare?

Semplicemente, il Dictionary è un tipo generico che consente:

  • tipizzazione statica (e verifica in fase di compilazione)
  • usare senza boxe

Se sei .NET 2.0 o superiore, dovresti preferire il Dictionary (e le altre raccolte generiche)

Una differenza sottile ma importante è che Hashtable supporta più thread di lettura con un singolo thread di scrittura, mentre Dictionary non offre alcuna sicurezza di thread. Se è necessaria la sicurezza del thread con un dizionario generico, è necessario implementare la propria sincronizzazione o (in .NET 4.0) utilizzare ConcurrentDictionary .

Diamo un esempio che spiegherebbe la differenza tra hashtable e dizionario.

Ecco un metodo che implementa hashtable

 public void MethodHashTable() { Hashtable objHashTable = new Hashtable(); objHashTable.Add(1, 100); // int objHashTable.Add(2.99, 200); // float objHashTable.Add('A', 300); // char objHashTable.Add("4", 400); // string lblDisplay1.Text = objHashTable[1].ToString(); lblDisplay2.Text = objHashTable[2.99].ToString(); lblDisplay3.Text = objHashTable['A'].ToString(); lblDisplay4.Text = objHashTable["4"].ToString(); // ----------- Not Possible for HashTable ---------- //foreach (KeyValuePair pair in objHashTable) //{ // lblDisplay.Text = pair.Value + " " + lblDisplay.Text; //} } 

Quanto segue è per dizionario

  public void MethodDictionary() { Dictionary dictionary = new Dictionary(); dictionary.Add("cat", 2); dictionary.Add("dog", 1); dictionary.Add("llama", 0); dictionary.Add("iguana", -1); //dictionary.Add(1, -2); // Compilation Error foreach (KeyValuePair pair in dictionary) { lblDisplay.Text = pair.Value + " " + lblDisplay.Text; } } 

C’è un’altra differenza importante tra un HashTable e un dizionario. Se si usano gli indicizzatori per ottenere un valore da una HashTable, HashTable restituirà null per un elemento inesistente, mentre il dizionario genererà un errore se si tenta di accedere a un elemento utilizzando un indicizzatore che non esiste nel dizionario

Il dizionario è tipizzato (quindi i tipi di valore non hanno bisogno di boxe), un Hashtable non lo è (quindi i tipi di valore richiedono la boxe). Hashtable ha un modo più bello di ottenere un valore rispetto al dizionario IMHO, perché sa sempre che il valore è un object. Anche se stai usando .NET 3.5, è facile scrivere un metodo di estensione per il dizionario per ottenere un comportamento simile.

Se hai bisogno di più valori per chiave, controlla qui il mio codice sorgente di MultiValueDictionary: multimap in .NET

Vuoi aggiungere una differenza:

Cercando di accedere a una chiave inesistente si dà errore di runtime nel dizionario, ma nessun problema in hashtable in quanto restituisce null invece di errore.

per esempio

  //No strict type declaration Hashtable hash = new Hashtable(); hash.Add(1, "One"); hash.Add(2, "Two"); hash.Add(3, "Three"); hash.Add(4, "Four"); hash.Add(5, "Five"); hash.Add(6, "Six"); hash.Add(7, "Seven"); hash.Add(8, "Eight"); hash.Add(9, "Nine"); hash.Add("Ten", 10);// No error as no strict type for(int i=0;i<=hash.Count;i++)//=>No error for index 0 { //Can be accessed through indexers Console.WriteLine(hash[i]); } Console.WriteLine(hash["Ten"]);//=> No error in Has Table 

qui nessun errore per la chiave 0 e anche per la chiave “dieci” (nota: t è piccola)

 //Strict type declaration Dictionary dictionary= new Dictionary(); dictionary.Add(1, "One"); dictionary.Add(2, "Two"); dictionary.Add(3, "Three"); dictionary.Add(4, "Four"); dictionary.Add(5, "Five"); dictionary.Add(6, "Six"); dictionary.Add(7, "Seven"); dictionary.Add(8, "Eight"); dictionary.Add(9, "Nine"); //dictionary.Add("Ten", 10);// error as only key, value pair of type int, string can be added //for i=0, key doesn't exist error for (int i = 1; i <= dictionary.Count; i++) { //Can be accessed through indexers Console.WriteLine(dictionary[i]); } //Error : The given key was not present in the dictionary. //Console.WriteLine(dictionary[10]); 

qui errore per la chiave 0 e anche per la chiave 10 poiché entrambi sono inesistenti nel dizionario, errore di runtime, mentre provo ad accedere.

La class Hashtable è un tipo specifico di class dizionario che utilizza un valore intero (chiamato hash) per facilitare l’archiviazione delle sue chiavi. La class Hashtable utilizza l’hash per accelerare la ricerca di una chiave specifica nella raccolta. Ogni object in .NET deriva dalla class Object. Questa class supporta il metodo GetHash, che restituisce un numero intero che identifica in modo univoco l’object. La class Hashtable è una raccolta molto efficiente in generale. L’unico problema con la class Hashtable è che richiede un po ‘di overhead e che per le piccole raccolte (meno di dieci elementi) il sovraccarico può impedire le prestazioni.

C’è qualche differenza speciale tra due che deve essere considerata:

HashTable: è una raccolta non generica, il più grande sovraccarico di questa raccolta è che esegue il pugilato automaticamente per i valori e al fine di ottenere il valore originale che è necessario eseguire unboxing, questi per ridurre le prestazioni dell’applicazione come penalità.

Dizionario: si tratta di un tipo generico di raccolta in cui non è implicita la boxe, quindi non è necessario annullare la boxing per ottenere sempre i valori originali che sono stati memorizzati in modo da migliorare le prestazioni dell’applicazione.

la seconda differenza considerevole è:

se stai tentando di accedere a un valore dalla tabella hash sulla base di una chiave che non esiste, restituirà null. Tuttavia, nel caso del dizionario, ti darà KeyNotFoundException.

L’interfaccia di ILookup è utilizzata in .net 3.5 con linq.

HashTable è la class base che è debolmente di tipo; la class astratta DictionaryBase è stata tipizzata in maniera estesa e utilizza internamente una HashTable.

Ho trovato una cosa strana sul dizionario, quando aggiungiamo le voci multiple nel dizionario, l’ordine in cui vengono aggiunte le voci viene mantenuto. Quindi se applico un foreach sul Dizionario, otterrò i record nello stesso ordine in cui li ho inseriti.

Considerando che, questo non è vero con HashTable normale, come quando aggiungo stessi record in Hashtable l’ordine non è mantenuto. Per quanto ne so, il dizionario è basato su Hashtable, se questo è vero, perché il mio dizionario mantiene l’ordine ma HashTable no?

Per quanto riguarda il motivo per cui si comportano in modo diverso, è perché il dizionario generico implementa un hashtable, ma non è basato su System.Collections.Hashtable. L’implementazione del dizionario generico si basa sull’allocazione di coppie chiave-valore da un elenco. Questi vengono quindi indicizzati con i bucket hashtable per l’accesso casuale, ma quando restituiscono un enumeratore, passa semplicemente l’elenco in ordine sequenziale – che sarà l’ordine di inserimento a condizione che le voci non vengano riutilizzate.

shiv govind Birlasoft. 🙂