HashSet vs List en C#: ¿Cuál usar y cuándo?
Si sigues usando listas para todo en C#, estás perdiendo rendimiento y ni siquiera lo sabes.
Así tal cual: List<T> es súper versátil, pero hay casos donde usarla es como correr una maratón con botas de montaña. Hoy te voy a mostrar por qué HashSet<T> puede ser tu mejor aliado en términos de velocidad y eficiencia, y cuándo deberías (o no) usarlo. Este post no es cualquier comparación —es la guía definitiva sobre HashSet vs List en C#, y te prometo que vas a salir de aquí con una idea clara, código listo para copiar, y un boost en tu rendimiento mental.
¿Qué es un HashSet y por qué es diferente a una List?
¿Sabías que un HashSet puede ser hasta 100 veces más rápido que una lista en ciertas operaciones?
Ambos tipos almacenan colecciones de datos, pero sus propósitos y arquitectura interna no podrían ser más distintos:
HashSet<T>:
- ❌ No permite duplicados
- ⚡ Usa hashing para almacenar elementos (clave para la velocidad)
- 📦 No mantiene un orden específico
List<T>:
- ✅ Permite duplicados
- 🐢 Usa un array dinámico → las búsquedas y eliminaciones son más lentas (O(n))
Comparación rápida:
| Operación | List<T> | HashSet<T> |
|---|---|---|
| Add | O(1) | O(1) |
| Contains | O(n) | O(1) |
| Remove | O(n) | O(1) |
Sí, los tres métodos más comunes —Add, Contains y Remove— pueden ser muchísimo más rápidos con HashSet. Esto se vuelve crítico cuando trabajas con grandes volúmenes de datos.
¿Qué es una tabla hash?
Vale, pero ¿por qué HashSet es tan rápido?
Una tabla hash es una estructura que usa una función hash para transformar un valor (como "Pedro") en un índice dentro de una tabla.
Piénsalo como un sistema de casilleros:
"Pedro"→ pasa por la función hash → aterriza directo en la posición 5
No hay necesidad de recorrer todos los elementos. Va directo al punto.
Este acceso casi instantáneo es lo que hace que operaciones como .Contains() y .Remove() sean O(1), mientras que en una List, necesitas recorrer cada elemento hasta encontrar lo que buscas (O(n)).
¿Cuándo usar HashSet en vez de List?
Si necesitas verificar duplicados en una lista grande, estás haciéndolo mal si no usas HashSet.
Aquí es cuando HashSet brilla:
- Necesitas garantizar valores únicos
- Haces muchas operaciones de búsqueda o eliminación
- Manejas grandes cantidades de datos
Ejemplo:
csharpCopiarEditarHashSet<int> numeros = new HashSet<int> { 1, 2, 3 };
Console.WriteLine(numeros.Contains(2)); // Súper rápido
Este .Contains(2) es directo al grano, casi instantáneo. En una List, el mismo resultado implicaría revisar elemento por elemento… y eso, en una lista gigante, duele.
¿Cuándo NO usar HashSet?
Ahora, tampoco es para todo.
Si usas HashSet en el caso equivocado, puedes estar desperdiciando memoria y ralentizando tu código.
Evita HashSet si:
- Necesitas mantener el orden de los elementos
- Requieres acceder por índice
- Tu colección es pequeña y estática
Ejemplo:
csharpCopiarEditarHashSet<string> nombres = new HashSet<string> { "Ana", "Pedro", "Luis" };
Console.WriteLine(nombres.ElementAt(1)); // Lento e impredecible
Sí, puedes hacer .ElementAt(), pero es una solución forzada y costosa. Para eso, mejor usa una List.
Prueba de rendimiento real
¿Qué pasa si comparamos HashSet y List con 1 millón de elementos?
Spoiler: la diferencia es brutal.
Código:
csharpCopiarEditarList<int> lista = new List<int>();
HashSet<int> conjunto = new HashSet<int>();
for (int i = 0; i < 100000000; i++) {
lista.Add(i);
conjunto.Add(i);
}
Stopwatch sw = Stopwatch.StartNew();
lista.Contains(99999999);
sw.Stop();
Console.WriteLine($"List: {sw.ElapsedMilliseconds}ms");
sw.Restart();
conjunto.Contains(99999999);
sw.Stop();
Console.WriteLine($"HashSet: {sw.ElapsedMilliseconds}ms");
Resultado:
- List: 23ms
- HashSet: 0ms
Conclusión
HashSet vs List en C# no es solo una comparación de estructuras de datos: es una decisión de rendimiento, claridad y propósito.
Usa HashSet cuando:
- Necesitas elementos únicos
- Haces muchas búsquedas o eliminaciones
- Trabajas con grandes datasets
Usa List cuando:
- Necesitas orden
- Quieres acceder por índice
- Tienes pocos elementos
Al final, no se trata de cuál es “mejor”, sino de cuál es más adecuada para el contexto.
Recursos recomendados
Y si quieres ver esto en acción, no te pierdas el video completo en mi canal de YouTube: “La Guía DEFINITIVA de HashSet para Principiantes 2025”


