Dictionary: cómo funciona en C#

Clase 15 de 35Curso de C# con .Net Core 2.1

Resumen

Optimiza la gestión de colecciones en C# con Dictionary, una estructura clave en .NET para mapear llaves a valores y acceder a datos de forma directa. Aquí verás cómo declararlo, agregar y recorrer elementos con foreach, leer por índice, y la diferencia entre actualizar y usar Add cuando trabajas en Visual Studio Code y ejecutas con .NET run.

¿Qué es un Dictionary en C# y cómo se declara?

Un diccionario es una colección genérica con dos tipos: llave y valor. En el ejemplo se usa un entero como llave y un string como valor. Las llaves son únicas y cada elemento es un par llave-valor.

  • Estructura genérica: dos tipos, uno para llave y otro para valor.
  • Llave única: no se repite en la colección.
  • Cada elemento es un KeyValuePair con propiedades Key y Value.

Ejemplo de declaración e inserción inicial:

using System;
using System.Collections.Generic;

var diccionario = new Dictionary<int, string>();

// Adicionar elementos
diccionario.Add(10, "Juanca");
diccionario.Add(23, "lorem ipsum");

¿Cómo agregar, recorrer y acceder por índice un diccionario?

Puedes recorrer con foreach y un KeyValuePair, imprimiendo Key y Value con Console.WriteLine. También puedes leer un valor directamente con el indexador usando la llave.

  • Recorrido con foreach: simple y claro para colecciones.
  • Lectura por indexador: diccionario[llave] devuelve el valor.
  • Excepción por llave inexistente: acceder a una llave que no existe lanza error.

Recorrer e imprimir:

foreach (KeyValuePair<int, string> kv in diccionario)
{
    Console.WriteLine($"Key {kv.Key}, valor {kv.Value}");
}

Acceder por índice a una llave existente:

Console.WriteLine(diccionario[23]); // imprime "lorem ipsum"

Acceder a una llave inexistente genera excepción. Luego, asignar con indexador crea o reemplaza el valor:

// diccionario[0] // lanzaría excepción si no existe.

diccionario[0] = "Peckerman"; // crea la llave 0 con ese valor.

¿Cómo usar llaves string para casos más cercanos al negocio?

También puedes usar Dictionary<string, string> para descripciones o glosarios.

var dic = new Dictionary<string, string>();

dic["luna"] = "cuerpo celeste que gira alrededor de la tierra";
Console.WriteLine(dic["luna"]);

// Reemplazo del contenido asociado a la misma llave

dic["luna"] = "protagonista de Soy Luna";
Console.WriteLine(dic["luna"]); // imprime la nueva definición
  • Llaves tipo string: útiles para términos del dominio.
  • Reemplazo por indexador: cambia el valor sin crear una nueva llave.

¿Qué diferencia hay entre actualizar y adicionar con Add en Dictionary?

Actualizar con el indexador reemplaza el valor de una llave existente o crea la llave si no existía. En cambio, adicionar con Add exige que la llave no exista; si ya existe, lanza excepción.

  • Indexador: crea o reemplaza el valor de una llave.
  • Add: solo crea; falla si la llave está repetida.
  • Llaves únicas: regla central del diccionario.

Ejemplo del error por duplicado:

var dic = new Dictionary<string, string>();
dic["luna"] = "cuerpo celeste que gira alrededor de la tierra";

// Esto provoca excepción porque "luna" ya existe
// System.ArgumentException: An item with the same key has already been added.
dic.Add("luna", "protagonista de Soy Luna");
  • Manejo esperado: si necesitas cambiar el valor, usa el indexador dic["luna"] = "...".
  • Validación previa: antes de Add, verifica existencia con ContainsKey si planeas controlar el flujo.

¿Te gustaría ver más patrones prácticos con Dictionary en C#? Comparte tu caso de uso en los comentarios y continuamos la conversación.