Hashtable e Dictionary in C Sharp

Giorgio Borelli

Guida all'uso delle classi contenitrici di dati, le Hashtable e le Dictionary delle collections del framework.NETLe Collections del .NET framework sono "oggetti" fondamentali per svolgere il ruolo di contenitori di dati, tutte le classi che implementano le Collections sono incluse nel namespasce System.Collections, e tramite esse e possibile definire strutture dati come array, liste, hashtable che ben si prestano a contenitori di dati ed alla gestione semplificata dei dati stessi, come inserimento, cancellazione, ordinamento e così via.

Tutte le Collections del .NET framework implementano due interfacce, ICollection e IEnumerable, che definiscono una serie di metodi e proprietà comuni che rendono le Collections utilissime per la gestione dei dati a livello di codice, troviamo infatti proprietà e metodi come Count, CopyTo, GetEnumerator che semplificano enormemente la vita allo sviluppatore.

Le classi facenti parte del namespace System.Collections sono: Array, ArrayList, BitArray, Dictionary, Hashtable, Queue (code), List, SortedList, Stack (pile). Ognuna di esse implementa ulteriori interfacce che ne specializzano l'uso.

In particolare, due di queste classi, si addicono perfettamente alla gestione dei dati in maniera indicizzata, come una rubrica od un dizionario, tramite una coppia di elementi detti chiave-valore, stiamo parlando delle Hashtable e dei Dictionary.

Sia le Hashtable che le Dictionary per la loro tipica struttura dati formata da un'insieme di elementi chiave-valore si prestano benissimo in tutti quei casi dove è necessario gestire con facilità la memorizzazione e la ricerca di dati, come avviene esattamente per una rubrica telefonica o una mail list.

Supponiamo di voler gestire una lista di studenti universitari prendendo in considerazione il solo nome e numero di matricola, allora faremo in questo modo:

//per le Hashtable
Hashtable studenti = new Hashtable();
studenti.Add(0323414, "Rossi Mario");
studenti.Add(0678541, "Bianchi Giovanni");
studenti.Add(0372889, "Verdi Giuseppe");
studenti.Add(0916532, "Nero Antonio");

//per le Dictionary
Dictionary<int, string> studenti = new Dictionary<int,string>();
studenti.Add(0323414, "Rossi Mario");
studenti.Add(0678541, "Bianchi Giovanni");
studenti.Add(0372889, "Verdi Giuseppe");
studenti.Add(0916532, "Nero Antonio");

Avete subito notato la differenza, mentre i tipi delle coppie chiave-valore delle Hashtable sono dei System.Objects, quelli per le Dictionary vengono definiti esplicitamente, questo comporta un vantaggio da parte di quest'ultime rispetto alle prime poichè in fase di conversione del tipo non devono fare il boxing ed unboxing dell'oggetto residente in memoria.

Possiamo inserire gli elementi anche direttamente, specificando la chiave ed associandogli il valore, in questo modo:

studenti[0897322] = "Marrone Piero";

In questo caso però, se la chiave non esiste crea un nuovo elemento, se la chiave esiste sovrascrive il valore esistente, se invece provassimo ad inserire un nuovo valore per una chiave esistente con il metodo "Add" otterremo un'eccezione.

Per cancellare un elemento invece basta richiamare il metodo Remove, specificano o la chiave o il valore:

studenti.Remove("Marrone Piero");

Per cancellare invece l'intera lista, basta richiamare il metodo Clear, in questo modo:

studenti.Clear();

Esistono tutta una serie di altri utili metodi per copiare, spostare, contare gli elementi, controllare se esiste una chiave o un valore, ritornare la lista delle chiavi o dei valori, che non staremo qui ad elencare in quanto sono di facile ed intuitivo utilizzo richiamandoli semplicemente con l'intellisense di Visual Studio.

Quello che invece vogliamo mettere in evidenza è la facilità con cui possiamo effettuare delle ricerche all'interno delle Hashtable e dei Dictionary, proprio perchè indicizzate, basta specificare la chiave per ottenere subito l'elemento e viceversa (vale solo per le Hashtable):

string nomeStudente = (string)studenti[0372889];

int matricola = (int)studenti["Verdi Giuseppe"]; //vale solo per le Hashtable

La ricerca degli elementi nelle Hashtable e nelle Dictionary a mezzo indice è immediata, presenta infatti una complessità pari ad O(1). Lo svantaggio presentato dalle Hashtable e dalle Dictionary si evidenzia invece nell'ordinamento, poichè gli elementi non sono ordinati in alcun mono ed è previsto un'ordinamento solo per chiave e non per valore.

 

Allora quando usare le Hashtable e quando i Dictionary? Dipende molto dal tipo e dalla quantità di dati da trattare, se si conoscono a priori i tipi dei dati, allora sicuramente conviene definire delle Dictionary specificando i tipi esatti, evitando così il boxing e l'unboxing degli ogetti in memoria, d'altro canto le Hashtable sono particolarmente indicate per trattare grosse mole di dati  i cui tipi possono essere differenti. Ulteriori risposte possono essere dettate dal contesto dell'applicazione e da tante altre motivazioni, invito pertanto i lettori a consigliare ed esporre le proprie esperienze di programmazione in merito alle Hashtable ed i Dictionary tramite i commenti.

Categorie: C#

Tags:

Aggiungi Commento

biuquote
Loading