C# Tabla hash (Hashtable)
Cada elemento de la tabla hash tiene unkey=>valuepar clave-valor, y la clave se utiliza para acceder a los elementos de la colección.
La tabla hash organiza y accede a los datos basándose en un algoritmo hash, proporcionando operaciones eficientes de búsqueda, inserción y eliminación.
HashtableEs una colección no genérica, ubicada en el espacio de nombresSystem.Collections. Si se necesita una versión genérica, se puede utilizarDictionary<TKey, TValue>。
Estructura básica:
- Tecla(
Key): Se utiliza para identificar cada elemento de datos, debe ser única y no puede sernull。 - Valor(
Value): Los datos correspondientes a la clave, pueden sernull。
Características:
- Almacenamiento de pares clave-valor: Cada clave es única y está asociada con un valor.
- Algoritmo hash: Localiza la posición de almacenamiento de los datos mediante el código hash de la clave; la complejidad temporal promedio de las operaciones de búsqueda e inserción es O(1).
- Ajuste dinámico de capacidad: Cuando el número de elementos en la tabla hash supera la capacidad, la tabla se expande dinámicamente y reasigna el almacenamiento.
- Almacenamiento sin orden: El orden de almacenamiento de los pares clave-valor no está relacionado con el orden de inserción, sino que está determinado por el código hash.
Métodos y propiedades de la clase Hashtable
La siguiente tabla enumeraHashtablealgunas de uso común de la clasepropiedades:
| Nombre de la propiedad | Tipo | Descripción |
|---|---|---|
Count | int | Obtiene el número de pares clave-valor contenidos en la tabla hash. |
IsReadOnly | bool | Indica si la tabla hash es de solo lectura. |
IsFixedSize | bool | Indica si la tabla hash tiene un tamaño fijo. |
IsSynchronized | bool | Indica si la tabla hash es segura para subprocesos. |
Keys | ICollection | Obtiene la colección de todas las claves de la tabla hash. |
Values | ICollection | Obtiene la colección de todos los valores de la tabla hash. |
SyncRoot | object | Obtiene un objeto que se puede utilizar para sincronizar el acceso a la tabla hash. |
La siguiente tabla enumeraHashtablealgunos de uso común de la clasemétodos:
| Nombre del método | Tipo de retorno | Descripción |
|---|---|---|
| Agregar y eliminar | ||
Add(object key, object value) | void | Agrega el par clave-valor especificado a la tabla hash. |
Clear() | void | Vacía la tabla hash. |
Remove(object key) | void | Elimina el par clave-valor de la clave especificada. |
| Consulta y acceso | ||
Contains(object key) | bool | Determina si la tabla hash contiene la clave especificada. |
ContainsKey(object key) | bool | Determina si la tabla hash contiene la clave especificada (equivalente aContains)。 |
ContainsValue(object value) | bool | Determina si la tabla hash contiene el valor especificado. |
| Copia y enumeración | ||
CopyTo(Array array, int index) | void | Copia los elementos de la tabla hash a una matriz, comenzando en el índice especificado. |
GetEnumerator() | IDictionaryEnumerator | Devuelve un enumerador de la tabla hash para recorrer los pares clave-valor. |
Ejemplo
El siguiente ejemplo demuestra el concepto de la tabla hash (Hashtable):
Ejemplo
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable();
ht.Add("001", "Zara Ali");
ht.Add("002", "Abida Rehman");
ht.Add("003", "Joe Holzner");
ht.Add("004", "Mausam Benazir Nur");
ht.Add("005", "M. Amlan");
ht.Add("006", "M. Arif");
ht.Add("007", "Ritesh Saikia");
if (ht.ContainsValue("Nuha Ali"))
{
Console.WriteLine("This student name is already in the list");
}
else
{
ht.Add("008", "Nuha Ali");
}
// Obtener la colección de claves
ICollection key = ht.Keys;
foreach (string k in key)
{
Console.WriteLine(k + ": " + ht[k]);
}
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:
007: Ritesh Saikia 004: Mausam Benazir Nur 005: M. Amlan 008: Nuha Ali 002: Abida Rehman 003: Joe Holzner 001: Zara Ali 006: M. Arif
Comparación con otras colecciones
| Característica | Hashtable | Dictionary<TKey, TValue> |
|---|---|---|
| Seguridad de tipos | No (no genérico, almacenaobjecttipo) | Sí (genérico, restricción de tipo fuerte) |
| Rendimiento | Más lento (requiere operaciones de boxing y unboxing) | Más rápido (sin operaciones de boxing, los genéricos admiten tipos directamente) |
| Unicidad de la clave | Sí | Sí |
Si el valor puede sernull | Sí | Sí |
| Ordenación | Ninguno | Ninguno |
| Seguridad para subprocesos | No seguro para subprocesos de forma predeterminada | No seguro para subprocesos de forma predeterminada |
HashtableEs una colección de pares clave-valor eficiente, adecuada para escenarios que requieren almacenamiento y recuperación rápidos de pares clave-valor.- La versión no genéricatiene un diseño que la hace inferior a las colecciones de versión genérica en seguridad de tipos y rendimiento (como
Dictionary<TKey, TValue>)。 - En el desarrollo moderno de C#,
Dictionary<TKey, TValue>se usa más frecuentemente, peroHashtabletodavía es adecuada para aplicaciones simples o escenarios de compatibilidad con código heredado.
Colecciones de C#