Area di riferimento
- Developing applications that use system types and collections
- Manage a group of associated data in a .NET Framework application by using collections. (Refer System.Collections namespace)
- Hashtable class
- DictionaryEntry class
- IDictionary interface and IDictionaryEnumerator interface
- IEqualityComparer interface
Hashtable
La classe Hashtable permette di memorizzare coppie chiave/valore cioè una struttura dati di tipo dizionario.
Vediamo che il suo utilizzo è molto semplice:
Hashtable table = new Hashtable(); // creazione di una nuova tabella hash
table.Clear(); // svuota la tabella hash
table.Add(111111, "Andrea"); // inserisce una nuova coppia chiave/valore
table.Add(222222, "Stefano");
table.Add(333333, "Giorgio");
table.Add(444444, "Vincenzo");
Console.WriteLine("Nomero di entry: {0}", table.Count); // 2
Console.WriteLine("Esiste 111111 ? {0}", table.Contains(111111)); // true
Console.WriteLine("Esiste Alessandro ? {0}", table.ContainsValue("Alessandro")); // false
Console.WriteLine("La matricola {0} corrisponde a {1}", 111111, table[111111]); // Andrea
table.Remove(222222); // Rimuove una coppia chiave valore dalla tabella hash
Console.WriteLine("Esiste 222222 ? {0}", table.ContainsKey(222222)); // Falso perchè è stata rimossa
Console.WriteLine("\nElenco studenti presenti: ");
foreach (int matricola in table.Keys)
{
Console.WriteLine("\tMatricola {0}: {1}", matricola, table[matricola]);
}
Console.WriteLine("\nElenco studenti presenti: ");
foreach (DictionaryEntry entry in table)
{
Console.WriteLine("\tMatricola {0}: {1}", entry.Key, entry.Value);
}
Hashtable implementa l'interfaccia ICollection e quindi anche IEnumerator. Ciò consente di utilizzare il costrutto foreach per scorrere i suoi elementi.
Ciascun elemento o entry viene rappresentato mediante la struttura DictionaryEntry così definita:
[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct DictionaryEntry
{
private object _key;
private object _value;
public DictionaryEntry(object key, object value);
public object Key { get; set; }
public object Value { get; set; }
}
La maggior parte dei metodi offerti da Hashtable rappresenta l'implementazione dell'interfaccia IDictionary:
[ComVisible(true)]
public interface IDictionary : ICollection, IEnumerable
{
// Methods
void Add(object key, object value);
void Clear();
bool Contains(object key);
IDictionaryEnumerator GetEnumerator();
void Remove(object key);
// Properties
bool IsFixedSize { get; }
bool IsReadOnly { get; }
object this[object key] { get; set; }
ICollection Keys { get; }
ICollection Values { get; }
}
E' possibile creare una hashtable utilizzando un costruttore che accetta una istanza di un oggetto che implementa l'interfaccia IEqualityComparer. Questo consente di stabilire il criterio mediante il quale stabilire l'uguaglianza tra due oggetti chiave. E' importante definire entrambi i metodi Equals e GetHashCode.
[ComVisible(true)]
public interface IEqualityComparer
{
// Methods
bool Equals(object x, object y);
int GetHashCode(object obj);
}