English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Hashtable in C# (Tabella hash)

Hashtable è una collezione non generica che memorizza coppie di chiave/valore, simile alla collezione generica Dictionary<TKey,TValue>. Ottimizza la ricerca calcolando l'hash di ogni chiave e lo memorizza in diversi bucket interni, poi corrisponde l'hash specificato alla chiave durante l'accesso ai valori.

Caratteristiche della Hashtable

  • Hashtable memorizza coppie di chiave/valore.

  • Appartiene al namespace System.Collection.

  • Implementa l'interfaccia IDictionary.

  • La chiave deve essere unica e non può essere null.

  • I valori possono essere null o duplicati.

  • È possibile accedere ai valori passando una chiave all'indice, ad esempio myHashtable[key]

  • Gli elementi vengono memorizzati come oggetti DictionaryEntry.

Creare una tabella hash (HashTable)

Di seguito è riportato un esempio su come creare una tabella hash e aggiungere elementi.

Hashtable numberNames = new Hashtable();
numberNames.Add(1,"One"); // Aggiungere chiave/valore utilizzando il metodo Add()
numberNames.Add(2,"Two");
numberNames.Add(3,"Three");
//Ecco un'eccezione di runtime: chiave già aggiunta. run-time exception: key already added.
//numberNames.Add(3, "Three"); 
foreach(DictionaryEntry de in numberNames)
    Console.WriteLine("Key: {0}, Value: {1}", de.Key, de.Value);
// utilizza la sintassi dell'inizializzatore di collection per creare una Hashtable
var cities = new Hashtable(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
;
foreach(DictionaryEntry de in cities)
    Console.WriteLine("Key: {0}, Value: {1}", de.Key, de.Value);

La collezione Hashtable può includere tutti gli elementi del dizionario, come mostrato di seguito.

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "one");
dict.Add(2, "two");
dict.Add(3, "three");
Hashtable ht = new Hashtable(dict);

Aggiorna la hash table

Passando una chiave all'indice, è possibile recuperare il valore corrispondente della chiave esistente dalla Hashtable. La Hashtable non è una collezione generica, quindi è necessario effettuare una conversione forzata del valore durante la ricerca.

// utilizza la sintassi dell'inizializzatore di collection per creare una Hashtable
var cities = new Hashtable(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
;
    
string citiesOfUK = (string) cities["UK"]; // converti in stringa
string citiesOfUSA = (string) cities["USA"]; // converti in stringa
Console.WriteLine(citiesOfUK);
Console.WriteLine(citiesOfUSA);
cities["UK"] = "Liverpool, Bristol"; // aggiorna il valore di UK
cities["USA"] = "Los Angeles, Boston"; // aggiorna il valore di USA
if(!cities.ContainsKey("France")){
    cities["France"] = "Paris";
}

Elimina un elemento dalla hash table

Il metodo Remove () elimina la chiave-valore che corrisponde al valore specificato nella Hashtable. Se non viene trovata la chiave specificata nella Hashtable, viene lanciata l'eccezione KeyNotfoundException, quindi è necessario utilizzare il metodo ContainsKey () per verificare la presenza della chiave esistente prima di eliminare.

Utilizzando il metodo Clear() è possibile eliminare tutti gli elementi in una volta.

var cities = new Hashtable(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
;
cities.Remove("UK"); // rimuovi UK
//cities.Remove("France"); // Lancia un'eccezione di runtime: KeyNotFoundException
if(cities.ContainsKey("France")){ // Controlla prima di estrarre la chiave
    cities.Remove("France");
}
cities.Clear(); // Elimina tutti gli elementi

Struttura gerarchica della classe HashTable

La figura seguente illustra la struttura gerarchica della classe Hashtable.

Tabella hash di C#