csharp-que-son-diccionarios

Qué son y cómo usar los diccionarios en C#

Un Diccionario en C# es una colección genérica que permite almacenar pares clave-valor. Proporcionan una forma muy eficiente de realizar búsquedas, inserciones y eliminaciones.

La clase Dictionary<TKey, TValue> en el espacio de nombres System.Collections.Generic es la implementación estándar de esta estructura de datos en C#.

Las claves deben ser únicas y no pueden ser nulas, mientras que los valores pueden ser duplicados y nulos.

Declaración e inicialización de diccionarios

Para declarar un diccionario en C#, se utiliza la siguiente sintaxis:

Dictionary<tipoClave, tipoValor> nombreDiccionario;

Por ejemplo, si queremos crear un Diccionario que almacene nombres de personas y sus edades, podemos utilizar la siguiente sintaxis:

Dictionary<string, int> edades = new Dictionary<string, int>();

En este ejemplo, hemos creado un Diccionario llamado edades que utiliza cadenas de texto como claves y enteros como valores.

Creación de un diccionario

Una vez declarado el diccionario, antes de poder usarlo debemos inicializarlo. Para ello debemos crear una nueva diccionario, y asignarla a la variable que hemos declarado anteriormente.

O, alternativamente, podemos hacerlo en el mismo momento en que declaramos nuestra Diccionario. Asi:

Dictionary<string, int> edades = new Dictionary<string, int>();

// equivalente
var edades = new Dictionary<string, int>();
Dictionary<string, int> edades = new ();

Inicialización de diccionarios

Alternativamente, también podemos inicializar el diccionario a una serie de valores conocidos.

Dictionary<string, int> edades = new ()
{
    { "Luis", 25 },
    { "María", 30 },
    { "Pedro", 28 }
};

Uso básico del diccionario

Añadir elementos a un diccionario

Para añadir elementos a un diccionario, se utiliza el método Add o el índice de la clave:

edades.Add("Luis", 32);
edades["Ana"] = 22;

Acceder a elementos de un diccionario

Los elementos de un diccionario se pueden acceder mediante sus claves:

int edadDeLuis = edades["Luis"];

Modificar elementos de un diccionario

Para modificar el valor asociado a una clave existente, simplemente se asigna un nuevo valor a esa clave:

edades["María"] = 35;

Eliminar elementos de un diccionario

Para eliminar elementos de un diccionario

edades.Remove("Pedro");

Enumerar elementos en un diccionario

Para recorrer todos los elementos de un diccionario, se puede usar un bucle foreach:

foreach (var item in edades)
{
    Console.WriteLine($"Nombre: {item.Key}, Edad: {item.Value}");
}

Limpiar todo el diccionario

edades.Clear();

Propiedades y métodos útiles de Dictionary<TKey, TValue>

Propiedad Count

La propiedad Count devuelve el número de pares clave-valor en el diccionario:

int cantidad = edades.Count;

Método ContainsKey

El método ContainsKey verifica si una clave específica está presente en el diccionario:

bool contieneLuis = edades.ContainsKey("Luis");

Método ContainsValue

El método ContainsValue verifica si un valor específico está presente en el diccionario:

bool contieneEdad30 = edades.ContainsValue(30);

Método TryGetValue

El método TryGetValue intenta obtener el valor asociado a una clave, devolviendo un valor booleano que indica si la operación fue exitosa:

int edad;
bool existe = edades.TryGetValue("Luis", out edad);

if (existe)
{
    Console.WriteLine($"La edad de Luis es: {edad}");
}
else
{
    Console.WriteLine("Luis no está en el diccionario");
}

Ejemplos prácticos

Almacenar información de estudiantes y sus calificaciones

En este ejemplo, se muestra cómo almacenar las calificaciones de varios estudiantes en un diccionario y calcular el promedio de cada uno.

// Crear un diccionario para almacenar las calificaciones de los estudiantes
var calificacionesEstudiantes = new Dictionary<string, List<int>>();

// Agregar calificaciones para cada estudiante
calificacionesEstudiantes["Luis"] = new List<int> { 90, 85, 88 };
calificacionesEstudiantes["María"] = new List<int> { 95, 92, 89 };
calificacionesEstudiantes["Pedro"] = new List<int> { 78, 84, 80 };

// Iterar sobre el diccionario y calcular el promedio de cada estudiante
foreach (var alumno in calificacionesEstudiantes)
{
    string nombre = alumno.Key; // Nombre del estudiante
    var calificaciones = alumno.Value; // Lista de calificaciones del estudiante
    double promedio = calificaciones.Average(); // Calcular el promedio

    Console.WriteLine($"Estudiante: {nombre}, Promedio: {promedio}");
}

Buscar el precio de un producto específico

En este ejemplo, se muestra cómo buscar el precio de un producto específico utilizando un diccionario.

// Crear un diccionario para almacenar los precios de los productos
var preciosProductos = new Dictionary<string, double>();

// Agregar precios para cada producto
preciosProductos["Manzana"] = 1.2;
preciosProductos["Banana"] = 0.5;
preciosProductos["Naranja"] = 0.8;

// Buscar el precio de un producto específico
string productoBuscar = "Banana";
if (preciosProductos.TryGetValue(productoBuscar, out double precio))
{
    Console.WriteLine($"Producto: {productoBuscar}, Precio: {precio}");
}
else
{
    Console.WriteLine($"El producto {productoBuscar} no se encuentra en el diccionario.");
}

Buscar el departamento de una lista de empleados

En este ejemplo, se muestra cómo utilizar un diccionario para realizar búsquedas rápidas. Suponiendo que tenemos un diccionario que tiene el departamento de cada persona, y una lista muy larga de personas que queremos buscar.

// Crear un diccionario para almacenar los departamentos de los empleados
// Suponemos que 'departamentosEmpleados' ya está poblado con miles de entradas
var departamentosEmpleados = new Dictionary<string, string>();

// Lista de empleados a buscar
// En el ejemplo hay 5 personas, pero supongamos que esta lista sea muy muy grande
List<string> empleadosABuscar = [ "Ana", "Luis", "Carlos", "Pedro", "María" ];

// Realizar búsquedas rápidas usando el diccionario
foreach (string empleadoBuscar in empleadosABuscar)
{
    if (departamentosEmpleados.TryGetValue(empleadoBuscar, out string departamento))
    {
        Console.WriteLine($"Empleado: {empleadoBuscar}, Departamento: {departamento}");
    }
    else
    {
        Console.WriteLine($"El empleado {empleadoBuscar} no se encuentra en el diccionario.");
    }
}