Struttura Dati Hashtable in C#

Nel Framework .NET è presente un’altra struttura dati molto importante, oltre agli ArrayList visti nella scorsa lezione di questo corso sul linguaggio C# ( sharp ), le Hashtable. Questa struttura contiene gli oggetti come coppie chiave-valore, ogni oggetto nella struttura è quindi individuabile tramite la sua chiave. Quest’ultima non può essere un valore nullo, mentre l’oggetto associato si. Gli oggetti utilizzati come chiave devono implementare i metodi GetHashCode ed Equals, che sono necessari per costruire la tabella interna dell’Hashtable e sono necessari per l’organizzazione della struttura dati. Quando un oggetto viene inserito nell’Hashtable, in pratica viene immesso nel “cestino” relativo al codice hash della chiave fornita. Un cestino ( bucket ) è una zona di memoria che può contenere uno o più oggetti. Al momento dell’inserimento dei dati viene verificato il codice hash della chiave ed identificato nel cestino relativo ed una volta individuato viene inserito in quest’ultimo. Per la ricerca si utilizza il valore di hash della chiave per identificare uno specifico cestino, in questo modo si riducono sostanzialmente il numero dei confronti di chiavi necessario per individuare l’elemento richiesto. Una proprietà fondamentale delle Hashtable è il fattore di carico ( load factor ) che determina il rapporto massimo tra il numero di elementi ed il numero dei cestini. Con fattori di carico bassi le ricerche avvengono più velocemente, ma si occupa più memoria. Con fattori di carico alti le ricerche sono più lente, ma si occupa meno memoria. Il valore standard per il fattore di carico è 1.0, che garantisce un buon rapporto tra velocità e consumo di memoria.
Vediamo ora i metodi più importanti per l’oggetto Hashtable:

  • Add – aggiunge un elemento nell’Hashtable
  • Clear – rimuove tutti gli elementi dall’Hashtable
  • Clone – serve per creare una copia della lista, senza copiare gli elementi in essa contenuti
  • Contains – determina se un elemento si trova o no nella struttura
  • ContainsKey – indica se una  chiave si trova in una struttura Hashtable
  • ContainsValue – indica se un oggetto è presente o meno nell’Hashtable
  • CopyTo – copia gli elementi presenti nell’Hashtable in un array all’indice specificato
  • GetEnumerator – ritorna un enumeratore che può essere utilizzato per scorrere l’Hashtable
  • Remove – rimuove uno specifico oggetto dalla struttura dati

Vediamo un esempio nel quale inseriamo alcuni valori in una Hashtable e quindi li stampiamo:

using System;
using System.Collections;

public class Corso
{
  static void Main(string[] args)
  {
    Hashtable myHash = new Hashtable();
    // Ogni riferimento a persone è casuale
    myHash.Add("studente1", "Mario Rossi");
    myHash.Add("studente2", "Giovanni Bianchi");
    myHash.Add("studente3", "Luigi Grigi");
    myHash.Add("studente4", "Carlo Bruni");
    myHash.Add("studente5", "Domenico Verdi");

    // Iteriamo tutta la hash con un enumerator
    IDictionaryEnumerator myEnum = myHash.GetEnumerator();
    while (myEnum.MoveNext())
      Console.WriteLine("{0} => {1}", myEnum.Key, myEnum.Value);

    Console.WriteLine("");

    // Stampiamo un valore del quale conosciamo la chiave
    if (myHash.ContainsKey("studente4"))
       Console.WriteLine(myHash["studente4"]);

    Console.ReadKey();
   }
}

Ho cercato di far vedere l’utilizzo delle Hastable in tutti i loro usi classici. Ricordo che per qualsiasi problema o istruzione non ben compresa potete fare domande e richiedere assistenza al nostro forum sul linguaggio C#.

<< Lezione Precedente – Inizio CorsoIndice LezioniLezione Successiva >>

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.