Condividi tramite


Tipi di raccolta 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 Dictionary<TKey,TValue> classe generica implementa anche l'interfaccia IDictionary<TKey,TValue> generica. Di conseguenza, ogni elemento di queste raccolte è una coppia chiave-valore.

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

La classe generica HashSet<T> è una raccolta non ordinata per 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 archiviato. Una funzione hash deve restituire sempre lo stesso codice hash per la stessa chiave. È possibile che una funzione hash generi lo stesso codice hash per due chiavi diverse, ma una funzione hash che genera un codice hash univoco per ogni chiave univoca comporta prestazioni migliori quando si recuperano elementi dalla tabella hash.

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

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

Ad esempio, una funzione hash per una stringa potrebbe accettare i codici ASCII di ogni carattere nella stringa e aggiungerli insieme per generare un codice hash. La stringa "picnic" avrebbe un codice hash diverso dal codice hash per la stringa "basket"; pertanto, le stringhe "picnic" e "cestino" sarebbero in bucket diversi. Al contrario, "stressed" e "desserts" avrebbero lo stesso codice hash e sarebbero nel stesso bucket.

Le Dictionary<TKey,TValue> classi e ConcurrentDictionary<TKey,TValue> hanno la stessa funzionalità della Hashtable classe . Un Dictionary<TKey,TValue> oggetto di un tipo specifico (diverso da Object) offre prestazioni migliori rispetto a un Hashtable oggetto per i tipi valore. Ciò avviene perché gli elementi di Hashtable sono di tipo Object, pertanto, la conversione boxing e unboxing si verificano in genere quando si archivia o si recupera un tipo di valore. La ConcurrentDictionary<TKey,TValue> classe deve essere usata quando più thread potrebbero accedere alla raccolta contemporaneamente.

Vedere anche