Condividi tramite


Tipi di insieme Hashtable e Dictionary

Aggiornamento: novembre 2007

La classe Hashtable e la classe generica Dictionary<TKey, TValue> implementano l'interfaccia IDictionary. Dictionary<TKey, TValue> implementa anche l'interfaccia generica IDictionary<TKey, TValue>. Di conseguenza, ciascun elemento di questi insiemi è costituito da una coppia chiave-valore.

Un oggetto Hashtable è costituito da bucket che contengono gli elementi dell'insieme. Un bucket è un sottogruppo virtuale di elementi all'interno di Hashtable, che rende le operazioni di ricerca e recupero più facili e veloci rispetto alla maggior parte degli insiemi. Ogni bucket si associa al codice hash, generato utilizzando una funzione hash e in base alla chiave dell'elemento.

La funzione hash è un algoritmo che restituisce codice hash numerico in base alla chiave. La chiave è il valore di una proprietà dell'oggetto archiviato. Una funzione hash deve sempre restituire lo stesso codice hash per la stessa chiave. Una funzione hash può generare lo stesso codice hash per due chiavi differenti, ma una funzione hash che genera codice univoco per ogni chiave offre prestazioni migliori quando si recuperano elementi dalla tabella hash.

Ogni oggetto utilizzato come elemento in Hashtable deve essere in grado di generare un proprio codice hash utilizzando un'implementazione del metodo GetHashCode. Tuttavia, è anche possibile specificare una funzione hash per tutti gli elementi in Hashtable utilizzando un costruttore di Hashtable che accetti come parametro un'implementazione di IHashCodeProvider.

Quando un oggetto viene aggiunto a Hashtable, esso viene archiviato nel bucket associato al codice hash che corrisponde al codice hash dell'oggetto. Quando un valore viene ricercato all'interno di Hashtable, verrà generato il codice hash per quel valore e verrà ricercato il bucket associato a tale codice hash.

Una funzione hash per una stringa, ad esempio, può utilizzare i codici ASCII per ogni carattere nella stringa e sommarli per generare il codice hash. La stringa "picnic" avrebbe codice hash diverso da quello per la stringa "basket", quindi le stringhe "picnic" e "basket" si troverebbero in bucket differenti. Al contrario, "stressed" e "desserts" hanno lo stesso codice hash e pertanto si troverebbero nello stesso bucket.

La classe Dictionary<TKey, TValue> presenta le stesse funzionalità della classe Hashtable. Una classe Dictionary<TKey, TValue> di tipo specifico (diverso da Object) offre migliori prestazioni rispetto a una classe Hashtable per i tipi di valore, poiché gli elementi di Hashtable sono di tipo Object e, pertanto, le conversioni boxing e unboxing avvengono in genere se viene archiviato o recuperato un tipo di valore.

Vedere anche

Riferimenti

Hashtable

IDictionary

IHashCodeProvider

Dictionary<TKey, TValue>

System.Collections.Generic.IDictionary<TKey, TValue>

Altre risorse

Tipi di insieme comunemente utilizzati