Diccionario vs Hashtable en C#

Haider Ali 12 octubre 2023
  1. Diccionario en C#
  2. Hashtable en C#
  3. Diccionario vs Hashtable en C#
Diccionario vs Hashtable en C#

Esta guía discutirá las diferencias entre Dictionary y Hashtable en C#.

Para comprender cuál de estas colecciones es mejor y preferida, debemos comprender sus fundamentos. Entonces, repasemos la sintaxis, las características, las funcionalidades y los métodos asociados con estas dos colecciones.

¿Cuál debería preferir cuando trabaje en C#? ¿Cual es mejor?

Todas estas preguntas serán respondidas a continuación. ¡Vamos a sumergirnos!

Diccionario en C#

El Diccionario es una colección genérica. Almacena datos en pares clave-valor, y esta colección no tiene un orden particular.

La sintaxis del Diccionario es la siguiente:

Dictionary<TKey, TValue>

Pasamos los valores de los datos junto con sus claves. Repasemos las características del Diccionario.

Características del Diccionario en C#

  1. Almacena pares clave-valor.
  2. Su espacio de nombres es System.Collections.Generic.
  3. Las claves del Dictionary no deben ser nulas y deben ser únicas.
  4. Sin embargo, los valores pueden ser nulos y duplicados.
  5. Podemos acceder al valor del dato a través de su clave correspondiente, por ejemplo, miDiccionario[clave].
  6. Todos los elementos se consideran KeyValuePair<TKey, TValue>.

Crear un Diccionario en C#

Puede crear un Diccionario en C# pasando el tipo de valores y sus correspondientes claves que puede almacenar. Mira el siguiente código para ver cómo creamos un Diccionario.

IDictionary<int, string> rollno_names = new Dictionary<int, string>();
rollno_names.Add(1, "Ali");  // adding a key/value using the Add() method
rollno_names.Add(2, "Haider");
rollno_names.Add(3, "Saad");

// The following throws runtime exception: key already added.
// rollno_names.Add(3, "Rafay");

foreach (KeyValuePair<int, string> i in rollno_names)
  Console.WriteLine("Key: {0}, Value: {1}", i.Key, i.Value);

// creating a dictionary using collection-initializer syntax
var countries = new Dictionary<string, string>() {
  { "UK", "United Kingdom" }, { "USA", "United States of America" }, { "PK", "Pakistan" }
};

foreach (var j in countries) Console.WriteLine("Key: {0}, Value: {1}", j.Key, j.Value);

En el código anterior, rollno_names es un Diccionario con int como tipo de datos clave y cadena como tipo de datos de valor de la siguiente manera:

Dictionary<int, string>

Este Diccionario en particular puede almacenar claves int y valores de cadena. El segundo Diccionario es de países realizado por la colección-inicializador.

Tanto sus claves como sus valores son de tipos de datos de cadena. Si intenta duplicar el valor-clave y convertirlo en nulo, obtendrá una excepción de tiempo de ejecución.

Acceder a un Elemento de Diccionario en C#

Puede acceder a un elemento Diccionario con la ayuda de su indexador. Debe especificar cada clave para acceder a su valor correspondiente.

ElementAt() es otro enfoque para obtener el par clave-valor. Echa un vistazo al siguiente código.

var countries = new Dictionary<string, string>() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

Console.WriteLine(countries["UK"]);   // prints value of UK key
Console.WriteLine(countries["USA"]);  // prints value of USA key
// Console.WriteLine(countries["France"]); // runtime exception: key does not exist

// use ContainsKey() to check for the unknown key
if (countries.ContainsKey("France")) {
  Console.WriteLine(countries["France"]);
}

// use TryGetValue() to get a value of the unknown key
string result;

if (countries.TryGetValue("France", out result)) {
  Console.WriteLine(result);
}

// use ElementAt() to retrieve the key-value pair using the index
for (int i = 0; i < countries.Count; i++) {
  Console.WriteLine("Key: {0}, Value: {1}", countries.ElementAt(i).Key,
                    countries.ElementAt(i).Value);
}

En el código anterior, puede ver que no hay ningún par clave-valor que contenga Francia. Entonces, el código anterior dará una excepción de tiempo de ejecución.

Actualizar un Elemento de Diccionario en C#

Al especificar una clave en el indexador, se puede cambiar/actualizar el valor de una clave. Si no se encuentra una clave en el Diccionario, lanzará la excepción KeyNotFoundException; por lo tanto, utilice la función ContainsKey() antes de acceder a cualquier clave desconocida.

Echa un vistazo al siguiente código.

var countries = new Dictionary<string, string>() { { "UK", "London, Manchester, Birmingham" },
                                                   { "USA", "Chicago, New York, Washington" },
                                                   { "PK", "Pakistan" } };

countries["UK"] = "Europe";    // update value of UK key
countries["USA"] = "America";  // update value of USA key
// countries["France"] = "Western Europe"; //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {
  countries["France"] = "Western Europe";
}

Eliminar un elemento de diccionario en C#

Un par clave-valor que ya existe en un Diccionario se elimina utilizando el método Remove(). Todos los elementos del Diccionario se eliminan utilizando el método Clear().

var countries = new Dictionary<string, string>() {
  { "UK", "UnitedKingdom" }, { "USA", "United state of America" }, { "PK", "Pakistan" }
};

countries.Remove("UK");  // removes UK
// countries.Remove("France"); //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {  // check key before removing it
  countries.Remove("France");
}

countries.Clear();

Hashtable en C#

A diferencia del Diccionario, Hashtable es una colección no genérica. También almacena pares clave-valor.

Al calcular el código hash de cada clave y almacenarlo en un cubo interno separado, mejora las búsquedas al hacer coincidir el código hash de la clave suministrada al acceder a los valores. Eche un vistazo a algunas características del Hashtable.

Características de la Hashtable en C#

  1. Los pares clave-valor se mantienen en Hashtables.
  2. Pertenece al espacio de nombres SystemCollection.
  3. Se implementa la interfaz IDictionary.
  4. Las claves no pueden ser nulas y deben ser distintas.
  5. Los valores pueden estar duplicados o ser nulos.
  6. Los valores se pueden obtener proporcionando al indexador la clave correspondiente, como en Hashtable[key].
  7. Los objetos DictionaryEntry se utilizan para almacenar los elementos.

Creación de una Hashtable en C#.

Mire el siguiente código que se explica por sí mismo para comprender la creación de un Hashtable.

`Hashtable` rollno_names = new `Hashtable`();
rollno_names.Add(1, "Ali");  // adding a key/value using the Add() method
rollno_names.Add(2, "Haider");
rollno_names.Add(3, "Saad");

// The following throws runtime exception: key already added.
// rollno_names.Add(3, "Rafay");

foreach (DictionaryEntry i in rollno_names)
  Console.WriteLine("Key: {0}, Value: {1}", i.Key, i.Value);

// creating a `Hashtable` using collection-initializer syntax
var countries = new `Hashtable`() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

foreach (DictionaryEntry j in countries) Console.WriteLine("Key: {0}, Value: {1}", j.Key, j.Value);

Podemos crear el Hashtable al igual que el Diccionario. La única diferencia es que no es genérico, por lo que no tenemos que especificar los tipos de datos de las claves y sus valores correspondientes.

Agregar diccionario en la hashtable en C#

Podemos crear el objeto del Diccionario, y simplemente pasando ese objeto mientras creamos el Hashtable, podemos agregar los pares clave-valor del Diccionario dentro del Hashtable.

Actualizar el Hashtable en C#

Al ingresar una clave en el indexador, puede recuperar el valor de una clave existente de la Hashtable. Dado que el Hashtable es una colección no genérica (lo que significa que no hay tipos de datos para claves y valores), se requiere convertirlo en una cadena cuando se obtienen valores de él.

Echa un vistazo al siguiente código.

// creating a Hashtable using collection-initializer syntax
var countries = new Hashtable() {
  { { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" } };

string countrynameUK = (string)countries["UK"];    // cast to string
string countrynameUSA = (string)countries["USA"];  // cast to string

Console.WriteLine(countrynameUK);
Console.WriteLine(countrynameUSA);

countries["UK"] = "Euorpe";    // update value of UK key
countries["USA"] = "America";  // update value of USA key

if (!countries.ContainsKey("France")) {
  countries["France"] = "Western Euorpe";
}

Eliminar elementos de la hashtable en C#

Los pares clave-valor dados de un Hashtable se eliminan utilizando el método Remove(). Si la clave proporcionada no está presente en el Hashtable, lanza la excepción KeyNotfoundException; por lo tanto, antes de eliminar una clave, use el método ContainsKey() para ver si ya existe.

Utilice la función Clear() para eliminar todos los elementos a la vez.

var countries = new Hashtable() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

countries.Remove("UK");  // removes UK
// countries.Remove("France"); //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {  // check key before removing it
  countries.Remove("France");
}

countries.Clear();  // removes all elements

Diccionario vs Hashtable en C#

Dictionary Hashtable
Si intentamos descubrir una clave que no existe, devuelve o genera una excepción. Si intentamos descubrir una clave que no existe, devuelve nulo.
Porque no hay boxing y unboxing, es más rápido que un Hashtable. Debido al empaquetado y desempaquetado requerido, lleva más tiempo que un Diccionario.
La seguridad de subprocesos solo está disponible para miembros estáticos públicos. Los miembros de una hashtable son todos seguros para subprocesos,
Dado que el Diccionario es un tipo genérico, se puede utilizar cualquier tipo de datos con él (Al crearlo, debemos especificar los tipos de datos tanto para claves como para valores). No es un tipo genérico.
La implementación de hashtable con claves y valores fuertemente tipados se llama diccionario. Dado que las tablas hash son estructuras de datos tipeadas de manera flexible, se puede agregar cualquier tipo de clave y valor.

En base a estos hechos, podemos decir que se prefiere Dictionary sobre Hashtable. Debido a que puede insertar cualquier elemento aleatorio en Dictionary<TKey, TValue> y no tiene que convertir los valores que extrae, gana seguridad de tipo.

Autor: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn

Artículo relacionado - Csharp Dictionary