Condividi tramite


Tipi di insieme Hashtable e Dictionary

La classe System.Collections.Hashtable e le classi generiche System.Collections.Generic.Dictionary<TKey, TValue> e System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue> implementano l'interfaccia System.Collections.IDictionary. La classe generica 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 è associato a un codice hash, generato utilizzando una funzione hash, ed è basato sulla chiave dell'elemento.

La classe generica HashSet<T> è un insieme non ordinato per contenere gli elementi univoci. Per ulteriori informazioni su questo insieme, vedere Tipo di raccolta HashSet.

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.

Le classi Dictionary<TKey, TValue> e ConcurrentDictionary<TKey, TValue> hanno le stesse funzionalità della classe Hashtable. Un oggetto Dictionary<TKey, TValue> di un tipo specifico (diverso da Object) offre prestazioni migliori rispetto a Hashtable per i tipi di valore. Questo avviene in quanto gli elementi di Hashtable sono di tipo Object e pertanto le conversioni boxing e unboxing vengono in genere eseguite quando si archivia o si recupera un tipo di valore. La classe ConcurrentDictionary<TKey, TValue> deve essere utilizzata quando più thread potrebbero accedere all'insieme contemporaneamente.

Vedere anche

Riferimenti

Hashtable

IDictionary

IHashCodeProvider

Dictionary<TKey, TValue>

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

System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>

Concetti

Tipo di raccolta HashSet

Tipi di insieme comunemente utilizzati