Tabla hash de C# con ejemplos

⚡ Resumen inteligente

En C#, una tabla hash es una colección del espacio de nombres System.Collections que almacena datos como pares clave-valor, donde cada clave única se corresponde con un valor y la clave permite una búsqueda rápida de ese valor almacenado.

  • 📚 Pares clave-valor: Una tabla hash almacena dos valores por elemento, una clave y su valor, en lugar del único valor que almacena una pila o una lista de matrices.
  • ➕ Agregar elementos: El método Add inserta una clave y un valor juntos, y cada clave dentro de la tabla hash debe ser única.
  • 👀 ContieneClave y ContieneValor: Estos métodos devuelven verdadero o falso, lo que permite comprobar si una clave o un valor ya existe.
  • 🔁 Valores de lectura: La propiedad Keys, junto con un bucle ICollection o DictionaryEntry, permite leer cada valor almacenado de forma secuencial.
  • 🛠️ Métodos y propiedades: Las funciones Remove, Clear, Count, Keys y Values ​​gestionan e inspeccionan el contenido de la tabla hash.
  • 🤖 Asistencia de IA: GitHub Copilot genera código para tablas hash, mientras que las versiones modernas de C# y ML.NET prefieren el diccionario genérico para datos clave-valor con seguridad de tipos.

Tabla hash de C#

¿Qué es Hashtable en C#?

Una tabla hash es una colección especial que se utiliza para almacenar elementos clave-valor. Entonces, en lugar de almacenar solo un valor como la pila, la lista de matrices y la cola, la tabla hash almacena 2 valores. Estos 2 valores forman un elemento de la tabla hash.

A continuación se muestran algunos ejemplos de cómo podrían verse los valores de una tabla hash.

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

Arriba tenemos 3 pares de valores clave. Las claves de cada elemento son 001, 002 y 003 respectivamente. Los valores de cada par clave-valor son ". Net“, “C#” y “ASP.Net” respectivamente.

Veamos con más detalle las operaciones disponibles para la colección Hashtable.

Declaración de la tabla hash

La declaración de una Hashtable se muestra a continuación. Una Hashtable se crea con la ayuda del tipo de datos Hashtable. La palabra clave "nueva" se utiliza para crear un objeto de Hashtable. Luego, el objeto se asigna a la variable ht.

Hashtable ht = new Hashtable()

Agregar elementos a la Hashtable

El método Add se utiliza para agregar un elemento al cola. La sintaxis general de la declaración se proporciona a continuación.

HashTable.add("key","value")

Ejemplo 1:

Recuerde que cada elemento de la tabla hash se compone de 2 valores, uno es la clave y el otro es el valor.

Ahora, veamos cómo esto funciona a nivel de código. Todo el código mencionado a continuación se escribirá en nuestra aplicación de consola.

El código se escribirá en nuestro archivo Program.cs. En el siguiente programa, escribiremos el código para ver cómo podemos utilizar los métodos mencionados anteriormente.

Por ahora, en nuestro ejemplo, solo veremos cómo podemos crear una tabla hash, agregar elementos a la tabla hash y mostrarlos en consecuencia.

Tabla hash en C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   ICollection keys = ht.Keys;

   foreach (String k in keys)
   {
    Console.WriteLine(ht[k]);
   }
    Console.ReadKey();
   }
 }
}

Code Explicación:-

  1. Primero, declaramos la variable hashtable usando el tipo de datos Hashtable usando la palabra clave "Nuevo". El nombre de la variable definida es 'ht'.
  2. Luego agregamos elementos a la tabla hash usando el método Agregar. Recuerde que debemos agregar un elemento clave y de valor al agregar algo a la tabla hash.
  3. No existe una forma directa de mostrar los elementos de una tabla hash.
    • Para mostrar la tabla hash, primero necesitamos obtener la lista de claves (001, 002 y 003) de la tabla hash.
    • Esto se hace a través de la interfaz ICollection. Este es un tipo de datos especial que se puede utilizar para almacenar las claves de colecciones de tablas hash. Luego asignamos las claves de la colección de la tabla hash a la variable "claves".
  4. A continuación, para cada valor clave, obtenemos el valor asociado en la tabla hash usando la declaración ht[k].

Si el código anterior se ingresa correctamente y se ejecuta el programa, se mostrará el siguiente resultado.

Salida:

Tabla hash en C#

Veamos algunos métodos más disponibles para tablas hash.

Contiene clave

Este método se utiliza para ver si hay una clave presente en Hashtable. A continuación se muestra la sintaxis general de esta declaración. La declaración devolverá verdadero si la clave existe; de ​​lo contrario, devolverá el valor falso.

Hashtable.Containskey(key)

Contiene valor

Este método se utiliza para ver si un valor está presente en la tabla hash. A continuación se muestra la sintaxis general de esta declaración. La declaración devolverá verdadero si el valor existe; de ​​lo contrario, devolverá el valor falso.

Hashtable.ContainsValue(value)

Ejemplo 2:

Cambiemos el código en nuestro Aplicación de consola para mostrar cómo podemos utilizar el método "Containskey" y "ContainsValue".

Tabla hash en C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code Explicación:-

  1. Primero, usamos el método ContieneKey para ver si la clave está presente en la tabla hash. Este método devolverá verdadero si la clave está presente en la tabla hash. Este método debería devolver verdadero ya que la clave existe en la tabla hash.
  2. Luego usamos el método ContieneValue para ver si el valor está presente en la tabla hash. Este método devolverá "verdadero" ya que el valor existe en la tabla hash.

Si el código anterior se ingresa correctamente y se ejecuta el programa, se mostrará el siguiente resultado.

Salida:

Tabla hash en C#

En el resultado, puede ver claramente que tanto la clave como el valor que se busca están presentes en la tabla hash.

Cómo recorrer una tabla hash en C#

Los ejemplos anteriores leen valores a través de la colección Keys, pero una tabla hash se puede recorrer de una manera más limpia. Un bucle foreach sobre un DictionaryEntry proporciona la clave y el valor de cada elemento en una sola pasada, que es la forma más común de leer una tabla hash.

Paso 1) Crea una tabla hash y agrégale tres pares clave-valor.

Paso 2) Recorre la tabla hash con una variable DictionaryEntry y, a continuación, lee las propiedades Clave y Valor de cada entrada.

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("101", "Java");
   ht.Add("102", "Python");
   ht.Add("103", "Kotlin");

   foreach (DictionaryEntry entry in ht)
   {
    Console.WriteLine(entry.Key + " - " + entry.Value);
   }
   Console.ReadKey();
  }
 }
}

Code Explicación:-

  1. Se crea una tabla hash llamada ht y se insertan tres pares clave-valor con el método Add.
  2. El bucle foreach asigna cada elemento a un DictionaryEntry, cuyas propiedades Key y Value exponen las dos mitades del par.

Cuando se ejecuta el programa, imprime cada clave junto a su valor, como por ejemplo 101. JavaDado que una tabla hash no conserva el orden de inserción, los pares pueden aparecer en una secuencia diferente a la de su adición. Para leer solo las claves, recorra la colección de claves; para leer solo los valores, recorra la colección de valores.

Métodos y propiedades de las tablas hash en C#

La clase Hashtable expone un pequeño conjunto de métodos y propiedades que cubren prácticamente todas las tareas necesarias, desde agregar y eliminar pares hasta verificar la pertenencia y contar elementos. Los miembros más útiles se enumeran a continuación.

Miembro Tipo Mareas Ideales para Lecciones
Agregar(clave, valor) Método Inserta un nuevo par clave-valor; la clave debe ser única.
Eliminar (clave) Método Elimina el elemento que coincide con la clave especificada.
Claro() Método Elimina todos los pares clave-valor de la tabla hash.
ContieneClave(clave) Método Devuelve verdadero cuando la clave proporcionada está presente.
ContieneValor(valor) Método Devuelve verdadero cuando el valor dado está presente.
Contar Propiedad Obtiene el número de pares clave-valor almacenados.
Teclados Propiedad Devuelve una colección de todas las claves.
Valores Propiedad Devuelve una colección de todos los valores.

Debido a que cada clave está cifrada mediante una función hash, ContainsKey y el indexador localizan un elemento en un tiempo prácticamente constante, lo que hace que una tabla hash sea tan útil para búsquedas rápidas.

Diferencia entre tabla hash y diccionario en C#

Tanto una tabla hash como un diccionario almacenan pares clave-valor, y ambos pertenecen a la familia más amplia de C#. coleccionesLa diferencia importante radica en la seguridad de tipos, y esa diferencia determina cuál debes elegir en el código nuevo.

  • Seguridad de tipos: Una tabla hash almacena cada clave y valor como un objeto, mientras que un diccionario Es genérico, por lo que el compilador comprueba los tipos que utilizas.
  • Espacio de nombres: Las tablas hash residen en System.Collections, mientras que los diccionarios residen en System.Collections.Generic.
  • BoxEn g: Una tabla hash encapsula tipos de valores como int, pero un diccionario genérico los almacena directamente y evita ese coste.
  • Actuación: Generalmente, usar un diccionario es más rápido porque no requiere una conversión inversa desde objeto al leer un valor.
  • Seguridad de la rosca: Hashtable ofrece la SyncEnvoltorio cronizado para un escritor con muchos lectores, mientras que el código concurrente suele elegir ConcurrentDictionary.

Para cualquier proyecto nuevo, el diccionario genérico es la opción recomendada, y la tabla hash no genérica aparece principalmente en código antiguo.

Preguntas Frecuentes

El método Remove elimina el elemento con la clave especificada y reduce el contador en uno. Si la clave no existe, no ocurre nada, por lo que debe llamar primero a ContainsKey cuando deba asegurarse de que la clave esté presente.

No. Cada clave en una tabla hash debe ser única. Llamar a Add con una clave que ya existe genera una ArgumentException. Sin embargo, puedes almacenar el mismo valor con varias claves diferentes sin que se produzca ningún error.

Una tabla hash admite de forma segura un escritor con muchos lectores. Para varios hilos de escritura, utilice una tabla hash.Synchronized, o prefiera ConcurrentDictionary de System.Collections.Concurrent, que maneja lecturas y escrituras concurrentes sin bloqueos externos.

La búsqueda de un valor mediante clave se ejecuta en un tiempo promedio casi constante de O(1), ya que la clave se somete a una función hash para encontrar su depósito. Las colisiones de hash importantes pueden ralentizar el proceso, pero esto es poco frecuente con claves bien distribuidas.

Un valor puede ser nulo, pero una clave no. Pasar una clave nula a Add o al indexador genera una excepción ArgumentNullException. Además, cada clave debe ser única y no debe cambiar mientras esté almacenada.

Una tabla hash no mantiene el orden, por lo que no se puede ordenar directamente. Copie sus claves en una lista o un ArrayList, ordene esa lista y luego lea los valores por clave. Un SortedList mantiene sus entradas ordenadas automáticamente.

Sí. GitHub Copilot escribe declaraciones de Hashtable, llamadas a Add y bucles de DictionaryEntry a partir de un comentario breve o el nombre de un método. A menudo sugiere usar el diccionario genérico, ya que es la colección recomendada para el código C# nuevo.

Los datos de entrenamiento de ML.NET fluyen a través de colecciones tipadas y la canalización IDataView, en lugar de una tabla hash. Sin embargo, los mapas clave-valor basados ​​en hash aún admiten búsquedas de características, codificación de vocabulario y almacenamiento en caché en torno a un modelo de aprendizaje automático.

Resumir este post con: