Comprender el diccionario de C#
El diccionario es una potente estructura de datos de C# que suele infrautilizarse. La clase Dictionary es una colección genérica que se encuentra dentro del espacio de nombres System.Collections.Generic. En su vídeo, "La estructura de datos del diccionario en C# en 10 minutos o menos", Tim Corey ofrece una guía concisa y práctica sobre cómo utilizar eficazmente los diccionarios en sus aplicaciones de C#. Este artículo desglosa las explicaciones y ejemplos de Tim, con el objetivo de ayudarte a comprender lo esencial del diccionario de C# con facilidad.
Introducción a los diccionarios
Tim comienza introduciendo el concepto de diccionario en C#. Lo compara con un diccionario de la vida real en el que se busca una palabra (clave) para encontrar su definición (valor). En C#, un diccionario es una colección de pares clave-valor en la que cada clave es única y no puede ser nula.
Creación de un diccionario
Un diccionario en C# se declara usando la sintaxis Dictionary<TKey, TValue>, lo que permite un almacenamiento y recuperación de datos eficientes a través de pares clave-valor. Con una capacidad inicial por defecto establecida durante su instanciación, los diccionarios pueden ajustarse dinámicamente a medida que se añaden elementos.
En (0:28), Tim comienza con una aplicación de consola básica para demostrar cómo crear un diccionario. Utiliza el siguiente código para inicializar un diccionario con enteros como claves y cadenas como valores:
// Declare a dictionary with integer keys and string values
Dictionary<int, string> rookieOfTheYear = new Dictionary<int, string>();
// Declare a dictionary with integer keys and string values
Dictionary<int, string> rookieOfTheYear = new Dictionary<int, string>();
Aquí, Dictionary<int, string> especifica que las claves serán enteros (int) y los valores serán cadenas de texto (string). La variable rookieOfTheYear es el nombre de la instancia del diccionario. También puedes usar claves de tipo cadena estableciendo el tipo de clave como string.
Añadir elementos a un diccionario
Tim añade ahora elementos al diccionario en (2:08). Él muestra cómo usar el método Add para agregar pares clave-valor:
// Add entries to the dictionary
rookieOfTheYear.Add(2000, "Mike Miller");
rookieOfTheYear.Add(2001, "Jane Doe");
rookieOfTheYear.Add(2002, "Jane Doe");
rookieOfTheYear.Add(2003, "John Smith");
// Add entries to the dictionary
rookieOfTheYear.Add(2000, "Mike Miller");
rookieOfTheYear.Add(2001, "Jane Doe");
rookieOfTheYear.Add(2002, "Jane Doe");
rookieOfTheYear.Add(2003, "John Smith");
En este ejemplo:
-
rookieOfTheYear.Add(2000, "Mike Miller")agrega la clave especificada2000con el valor"Mike Miller". - De manera similar, las claves
2001,2002, y2003están asociadas con"Jane Doe","Jane Doe", y"John Smith"respectivamente.
Señala que, aunque los valores pueden repetirse, las claves deben ser únicas. Al intentar añadir una clave duplicada se produce una excepción:
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
Esta excepción ocurre porque la clave 2001 ya existe en el diccionario.
Acceso a los elementos del diccionario
Para demostrar la recuperación de valores, Tim utiliza la siguiente línea de código en (3:45):
// Accessing a value with a specific key
Console.WriteLine(rookieOfTheYear[2002]); // Outputs: Jane Doe
// Accessing a value with a specific key
Console.WriteLine(rookieOfTheYear[2002]); // Outputs: Jane Doe
Aquí, rookieOfTheYear[2002] accede al valor asociado con la clave 2002. Se trata de una forma muy eficaz de buscar valores basados en claves.

Comprobación de la existencia de claves
A las (4:29), Tim discute cómo verificar si una clave existe en el diccionario usando el método ContainsKey:
// Check if a key exists before accessing its value
if (rookieOfTheYear.ContainsKey(2002))
{
Console.WriteLine(rookieOfTheYear[2002]);
}
// Check if a key exists before accessing its value
if (rookieOfTheYear.ContainsKey(2002))
{
Console.WriteLine(rookieOfTheYear[2002]);
}
En el ejemplo anterior, ContainsKey(2002) verifica si la clave 2002 existe en el diccionario. Si es así, se imprime el valor correspondiente ("Jane Doe").
Si la clave no existe, el diccionario no devuelve ningún resultado, lo que evita errores de acceso a claves inexistentes.
Capacidades de ampliación del diccionario
Tim amplía las capacidades del diccionario en (5:33), creando un ejemplo más complejo con un diccionario que asigna cadenas a listas de cadenas:
// Declare a dictionary with string keys and List<string> as values
Dictionary<string, List<string>> wishList = new();
// Add entries to the dictionary with lists as values
wishList.Add("Tim Corey", new List<string> { "Xbox", "Tesla", "Pizza" });
wishList.Add("Billy Bob", new List<string> { "PS5", "Ford", "Hoagie" });
wishList.Add("Mary Jane", new List<string> { "House", "Car", "Sub" });
// Declare a dictionary with string keys and List<string> as values
Dictionary<string, List<string>> wishList = new();
// Add entries to the dictionary with lists as values
wishList.Add("Tim Corey", new List<string> { "Xbox", "Tesla", "Pizza" });
wishList.Add("Billy Bob", new List<string> { "PS5", "Ford", "Hoagie" });
wishList.Add("Mary Jane", new List<string> { "House", "Car", "Sub" });
Toma:
-
Las claves son cadenas (por ejemplo, "Tim Corey", "Billy Bob", "Mary Jane").
- Los valores son listas de cadenas, que representan una lista de deseos para cada persona.
Iterando sobre un diccionario
A las (7:24), Tim demuestra cómo iterar sobre un diccionario usando un bucle foreach:
// Iterate over each key-value pair in the dictionary
foreach (var (key, value) in wishList)
{
Console.WriteLine($"{key}'s wish list:");
// Iterate over each item in the list of values
foreach (var item in value)
{
Console.WriteLine($"\t{item}");
}
}
// Iterate over each key-value pair in the dictionary
foreach (var (key, value) in wishList)
{
Console.WriteLine($"{key}'s wish list:");
// Iterate over each item in the list of values
foreach (var item in value)
{
Console.WriteLine($"\t{item}");
}
}
En este ejemplo:
-
foreach (var (key, value) in wishList)itera sobre cada par clave-valor en el diccionariowishList. -
keyse refiere a la clave (por ejemplo, "Tim Corey"). -
valuese refiere a la lista de valores asociados con esa clave. - El bucle interno itera sobre cada elemento de la lista y lo imprime.
Esto permite imprimir todos los elementos utilizando un bucle para acceder a los elementos del diccionario uno a uno con una clave especificada y su correspondiente valor especificado. Aquí está el resultado:

Acceso a valores más complejos
Tim también muestra cómo acceder a valores más complejos en el diccionario utilizando explícitamente el índice especificado en (8:26):
// Access the first item in the list of values for the specified key
Console.WriteLine(wishList["Tim Corey"][0]); // Outputs: Xbox
// Access the first item in the list of values for the specified key
Console.WriteLine(wishList["Tim Corey"][0]); // Outputs: Xbox
Aquí, wishList["Tim Corey"] accede a la lista asociada con la clave "Tim Corey", y [0] recupera el primer elemento de esa lista.
Conclusión
Tim concluye en (9:00) haciendo hincapié en la importancia de entender los diccionarios. Señala que, aunque los diccionarios no se utilicen con frecuencia, son increíblemente útiles para situaciones que requieren claves únicas y búsquedas eficaces.
Los puntos clave
-
Creación de diccionarios: Entender cómo inicializar diccionarios con varios tipos de datos.
-
Agregación de elementos: Aprende la importancia de las claves únicas y cómo manejar las excepciones de claves duplicadas.
-
Acceso a valores: Recuperar valores de forma eficiente utilizando claves.
-
Comprobación de la existencia de claves: Evite errores comprobando la existencia de claves antes de acceder a los valores.
-
Uso avanzado: Implementar diccionarios más complejos, como los que tienen listas como valores.
- Iteración: Utiliza bucles para acceder y mostrar todos los elementos de un diccionario.
Siguiendo el vídeo de Tim Corey, podrás dominar el uso de diccionarios en C#, mejorando tu conjunto de herramientas de programación para escenarios que requieran una recuperación y almacenamiento de datos eficientes. Visita el canal de Tim para ver más vídeos informativos sobre C#.

