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.
Class1se agrega al proyecto de forma predeterminada.Reemplace cualquier código del
Class1mó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
Personclase tiene un constructor que toma losFirstNameparámetros yLastNamey asigna estos parámetros a las variables locales. LaToStringfunción invalidaToStringde laObjectclase para devolverFnameyLnameconcatenar juntas.Cree un objeto de nivel
Hashtablede 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
Addmétodo delHashtableobjeto para agregar tresPersonobjetos aHashtableen untry-catchbloque . Eltry-catchbloque 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_Clickevento: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
Hashtableobjeto proporciona un indexador. En los pasos siguientes, indexe con paraKeyacceder 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_Clickevento://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
Removemétodo para quitar un solo elemento de laHashTablecolecció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_Clickevento:<?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
HashTablecolecció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_Clickevento:<?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
IDictionaryEnumeratory llama alGetEnumeratormétodo de laHashTablecolección. Con elEnumeratordevuelto, el código enumera los elementos de la colección y usa elKeysmétodo de para enumerar a través deHashTablelas claves.
En los pasos siguientes, use el
Clearmétodo para borrar :HashTableAgregue 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_Clickevento:MyTable.Clear(); MessageBox.Show("HashTable is now empty");
Siga estos pasos para compilar y ejecutar la aplicación:
- Seleccione Agregar elementos. Se agregan tres
Personobjetos a laHashTablecolección. - Seleccione Obtener elementos. El indexador obtiene los elementos de la
HashTablecolección. Se muestran los tres elementos recién agregados. - Seleccione Quitar elemento. Se elimina el elemento en la ubicación de la
Burrisclave. - Seleccione Enumerar.
IDictionaryEnumeratorenumera los elementos de laHashTablecolección y laKeyspropiedad deHashTabledevuelve una colección keys. - Seleccione Borrar. Todos los elementos se borran de la
HashTablecolecció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.