Dictionary y HashSet
Dictionary<K, V> es como un diccionario real: en lugar de buscar por posición (índice), buscas por nombre (clave). Dado un string "Ana", obtener su edad en un Dictionary<string, int> es O(1) sin importar si hay 10 o 10 millones de entradas.
Internamente usa hash tables: calcula un número hash de la clave y usa ese número para saber exactamente dónde está el valor. Es la estructura correcta cuando necesitas búsqueda rápida por nombre o identificador.
El método TryGetValue es el acceso seguro al Dictionary: en lugar de edades["Diana"] que lanza KeyNotFoundException si "Diana" no existe, usas edades.TryGetValue("Diana", out int edad) que devuelve false si no existe sin lanzar excepción. HashSet<T> es un Dictionary donde solo importan las claves, sin valores asociados: garantiza unicidad en O(1). Soporta operaciones matemáticas de conjuntos: IntersectWith (elementos en ambos), UnionWith (todos), ExceptWith (en uno pero no en el otro).
// Dictionary<K, V>
var capitales = new Dictionary<string, string>();
capitales["México"] = "Ciudad de México";
capitales["España"] = "Madrid";
capitales.Add("Colombia", "Bogotá");
// Inicializador de colección
var edades = new Dictionary<string, int> {
["Ana"] = 25,
["Bob"] = 30,
["Carlos"] = 28
};
// Acceso y verificación
Console.WriteLine(edades["Ana"]); // 25
bool existe = edades.ContainsKey("Bob"); // true
// TryGetValue - acceso seguro
if (edades.TryGetValue("Diana", out int edad)) {
Console.WriteLine($"Diana tiene {edad}");
} else {
Console.WriteLine("Diana no encontrada");
}
// GetValueOrDefault
int edadXenia = edades.GetValueOrDefault("Xenia", 0); // 0
// Recorrer
foreach (var par in edades) {
Console.WriteLine($"{par.Key}: {par.Value}");
}
foreach (string clave in edades.Keys) { /* ... */ }
foreach (int valor in edades.Values) { /* ... */ }
// Eliminar
edades.Remove("Bob");
// HashSet<T> - solo valores únicos
var conjunto = new HashSet<int> { 1, 2, 3, 4 };
conjunto.Add(5);
conjunto.Add(3); // Ignorado, ya existe
Console.WriteLine(conjunto.Count); // 5
bool contieneUno = conjunto.Contains(1); // true
conjunto.Remove(2);
// Operaciones de conjuntos
var a = new HashSet<int> { 1, 2, 3, 4 };
var b = new HashSet<int> { 3, 4, 5, 6 };
a.IntersectWith(b); // {3, 4}
a.UnionWith(b); // {1, 2, 3, 4, 5, 6}
a.ExceptWith(b); // {1, 2}
Practica esta lección
Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.
Empezar a practicar