Tipi di Collection 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 inoltre l'interfaccia generica IDictionary<TKey,TValue>. Ogni elemento di queste raccolte è pertanto una coppia chiave-valore.

Un oggetto Hashtable è costituito da bucket che contengono gli elementi della raccolta. Un bucket è un sottogruppo virtuale di elementi all'interno di Hashtable, che rende più semplici e veloci le operazioni di ricerca e recupero rispetto alla maggior parte delle raccolte. Ogni bucket è associato a un codice hash, generato usando una funzione hash ed basato sulla chiave dell'elemento.

La classe generica HashSet<T> è una raccolta non ordinata destinata a contenere elementi univoci.

Una funzione hash è un algoritmo che restituisce un codice hash numerico basato su una chiave. La chiave è il valore di una proprietà dell'oggetto che viene archiviato. Una funzione hash deve sempre restituire lo stesso codice hash per la stessa chiave. È possibile per una funzione hash generare lo stesso codice hash per due chiavi diverse, ma una funzione hash che genera un codice hash univoco per ogni chiave univoca offre prestazioni migliori durante il recupero di elementi dalla tabella hash.

Ogni oggetto usato come elemento in un oggetto Hashtable deve essere in grado di generare un codice hash per se stesso tramite un'implementazione del metodo GetHashCode. È tuttavia anche possibile specificare una funzione hash per tutti gli elementi in un oggetto Hashtable usando un costruttore Hashtable che accetta un'implementazione di IHashCodeProvider come uno dei parametri.

Quando un oggetto viene aggiunto a Hashtable, viene archiviato nel bucket associato al codice hash corrispondente al codice hash dell'oggetto. Quando viene cercato un valore in Hashtable, viene generato il codice hash per tale valore e viene eseguita la ricerca nel bucket associato a tale codice hash.

Ad esempio, una funzione hash per una stringa potrebbe prendere i codici ASCII di ogni carattere della stringa e combinarli per generare un codice hash. La stringa "picnic" avrebbe un codice hash diverso da quello della stringa "basket", pertanto le due stringhe si troverebbero in bucket diversi. "Stressed" e "desserts" avrebbero invece lo stesso codice hash e si troverebbero nello stesso bucket.

Le classi Dictionary<TKey,TValue> e ConcurrentDictionary<TKey,TValue> hanno la stessa funzionalità della classe Hashtable. Un oggetto Dictionary<TKey,TValue> di un tipo specifico (diverso da Object) offre prestazioni migliori rispetto a un oggetto Hashtable per i tipi di valore, in quanto gli elementi di Hashtable sono di tipo Object. 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 usata quando più thread potrebbero accedere contemporaneamente alla raccolta.

Vedi anche