Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se presenta cómo usar la HashTable
colección en Visual C#.
Versión original del producto: Visual C#
Número de KB original: 309357
Resumen
Dado que el hash elimina la necesidad de buscar datos costosos para recuperar los datos, puede usar hash para recuperar datos de forma eficaz. Hashing usa el valor de la propia clave para buscar los datos.
Las bibliotecas de clases base ofrecen una HashTable
clase definida en el System.Collections
espacio de nombres para que no sea necesario codificar sus propias tablas hash.
Pasos para compilar el ejemplo
Una HashTable
colección almacena un par (Key
, Value
) y usa para Key
aplicar un hash y obtener la ubicación de almacenamiento. es Key
inmutable y no puede tener entradas duplicadas en .HashTable
En este ejemplo se usan varias instancias de una clase simple Person
para almacenar en .HashTable
El apellido se usa como .Key
Abra Microsoft Visual Studio y cree un proyecto de aplicación de Windows Forms en Visual C#. Form1 se agrega al proyecto de forma predeterminada.
En Explorador de soluciones, haga clic con el botón derecho en el nombre del proyecto, seleccione Agregar y, a continuación, seleccione Clase para agregar un módulo de clase.
Class1
se agrega al proyecto de forma predeterminada.Reemplace cualquier código del
Class1
módulo por el código siguiente:public class Person { public string Fname, Lname;d public Person (string FirstName, string LastName) { Fname = FirstName; Lname = LastName; } public override string ToString () { return Fname + " " + Lname; } }
La
Person
clase tiene un constructor que toma losFirstName
parámetros yLastName
y asigna estos parámetros a las variables locales. LaToString
función invalidaToString
de laObject
clase para devolverFname
yLname
concatenar juntas.Cree un objeto de nivel
Hashtable
de formulario y declare tres variables de tipoPerson
. Agregue el siguiente código a la claseForm1
:<?xm-deletion_mark author="v-bobbid" time="20080711T172143-0800" data="private Hashtable MyTable = new Hashtable(); //For simplicity, create three Person objects to add to the HashTable collection. Person Person1,Person2,Person3; "?> <?xm-insertion_mark_start author="v-bobbid" time="20080711T172143-0800"?> System.Collections.Hashtable MyTable = new System.Collections.Hashtable(); //For simplicity, create three Person objects to add to the HashTable collection. Person Person1,Person2,Person3; <?xm-insertion_mark_end?>
En los pasos siguientes, use el
Add
método delHashtable
objeto para agregar tresPerson
objetos aHashtable
en untry-catch
bloque . Eltry-catch
bloque detecta la excepción y muestra un mensaje si existen claves duplicadas:Coloque un control Button en Form1 y cambie la propiedad Text a Agregar elementos.
Haga doble clic en el botón para abrir su ventana Código y pegue el código siguiente en el
Button1_Click
evento:Person1 = new Person("David", "Burris"); Person2 = new Person("Johnny", "Carrol"); Person3 = new Person("Ji", "Jihuang"); //The Add method takes Key as the first parameter and Value as the second parameter. try { MyTable.Add(Person1.Lname, Person1); MyTable.Add(Person2.Lname, Person2); MyTable.Add(Person3.Lname, Person3); } catch (ArgumentException ae) { MessageBox.Show("Duplicate Key"); MessageBox.Show(ae.Message); }
El
Hashtable
objeto proporciona un indexador. En los pasos siguientes, indexe con paraKey
acceder al valor almacenado en la ubicación con hash:Agregue un control Button a Form1 y cambie la propiedad Name a Obtener elementos.
Haga doble clic en el botón y pegue el código siguiente en el
Button2_Click
evento://Use the indexer of the Hashtable class to retrieve your objects. The indexer takes //Key as a parameter and accesses it with the Hashed location. try { MessageBox.Show(MyTable[Person1.Lname].ToString()); MessageBox.Show(MyTable[Person2.Lname].ToString()); MessageBox.Show(MyTable[Person3.Lname].ToString()); } catch (NullReferenceException ex) { MessageBox.Show("Key not in Hashtable"); MessageBox.Show(ex.Message); }
En los pasos siguientes, use el
Remove
método para quitar un solo elemento de laHashTable
colección:Agregue un control Button a Form1 y cambie la propiedad Text a Remove Item.
Haga doble clic en el botón y pegue el código siguiente en el
Button3_Click
evento:<?xm-deletion_mark author="v-bobbid" time="20080711T173011-0800" data="if (MyTable.Count == 0) { MessageBox.Show("There are no items in HashTable"); } else { MessageBox.Show("The count before removing an Item is" + " " + MyTable.Count); MessageBox.Show("Removing value stored at key value (Burris)"); Remove the object that is stored at the Key value Person1.Lname. MyTable.Remove(Person1.Lname); } "?> <?xm-insertion_mark_start author="v-bobbid" time="20080711T173011-0800"?>if (MyTable.Count == 0) { MessageBox.Show("There are no items in HashTable"); } else { MessageBox.Show("The count before removing an Item is" + " " + MyTable.Count); MessageBox.Show("Removing value stored at key value (Burris)"); // Remove the object that is stored at the Key value Person1.Lname. MyTable.Remove(Person1.Lname); } <?xm-insertion_mark_end?>
En los pasos siguientes, enumere los elementos almacenados en la
HashTable
colección:Agregue un control Button a Form1 y cambie la propiedad Text a Enumerate.
Haga doble clic en el botón y pegue el código siguiente en el
Button4_Click
evento:<?xm-deletion_mark author="v-bobbid" time="20080711T174252-0800" data="IDictionaryEnumerator Enumerator; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Enumerating through the Hashtable collection"); Enumerator = MyTable.GetEnumerator(); while (Enumerator.MoveNext()) { MessageBox.Show(Enumerator.Value.ToString()); } } ICollection MyKeys; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Accessing keys property to return keys collection"); MyKeys = MyTable.Keys; foreach (object Key in MyKeys) { MessageBox.Show(Key.ToString()); } } "?> <?xm-insertion_mark_start author="v-bobbid" time="20080711T174252-0800"?> System.Collections.IDictionaryEnumerator Enumerator; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Enumerating through the Hashtable collection"); Enumerator = MyTable.GetEnumerator(); while (Enumerator.MoveNext()) { MessageBox.Show(Enumerator.Value.ToString()); } } System.Collections.ICollection MyKeys; if (MyTable.Count == 0) MessageBox.Show("The hashtable is empty"); else { MessageBox.Show("Accessing keys property to return keys collection"); MyKeys = MyTable.Keys; foreach (object Key in MyKeys) { MessageBox.Show(Key.ToString()); } } <?xm-insertion_mark_end?>
Este código declara una variable de tipo
IDictionaryEnumerator
y llama alGetEnumerator
método de laHashTable
colección. Con elEnumerator
devuelto, el código enumera los elementos de la colección y usa elKeys
método de para enumerar a través deHashTable
las claves.
En los pasos siguientes, use el
Clear
método para borrar :HashTable
Agregue un control Button a Form1 y cambie la propiedad Text a Borrar.
Haga doble clic en el botón y pegue el código siguiente en el
Button5_Click
evento:MyTable.Clear(); MessageBox.Show("HashTable is now empty");
Siga estos pasos para compilar y ejecutar la aplicación:
- Seleccione Agregar elementos. Se agregan tres
Person
objetos a laHashTable
colección. - Seleccione Obtener elementos. El indexador obtiene los elementos de la
HashTable
colección. Se muestran los tres elementos recién agregados. - Seleccione Quitar elemento. Se elimina el elemento en la ubicación de la
Burris
clave. - Seleccione Enumerar.
IDictionaryEnumerator
enumera los elementos de laHashTable
colección y laKeys
propiedad deHashTable
devuelve una colección keys. - Seleccione Borrar. Todos los elementos se borran de la
HashTable
colección.
- Seleccione Agregar elementos. Se agregan tres
Nota:
Las compañías, organizaciones, productos, nombres de dominio, direcciones de correo electrónico, logotipos, personas, lugares y eventos que se citan a modo de ejemplo son ficticios. No se pretende indicar, ni debe deducirse, ninguna asociación con compañías, organizaciones, productos, dominios, direcciones de correo electrónico, logotipos, personas, lugares o hechos reales.