Elegir una colección
Equilibrios y rendimiento
Elegir una colección es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
Primero, una pregunta
Elegir una colección comienza con una pregunta: ¿cómo accederá a los datos? ¿Por posición, por clave o solo para comprobar la pertenencia?
List, Dictionary y HashSet responden a distintos patrones de acceso. Adapte la herramienta al patrón y su código seguirá siendo rápido y claro.
Acceso por posición: List
Si el orden es importante y accede a los elementos por índice, elija List<T>. Conserva el orden de inserción y ofrece indexación O(1).
Ejemplos: una cola de pasos, filas en orden de visualización o cualquier secuencia que recorra de principio a fin. Se permiten duplicados.
var steps = new List<string> { "mix", "bake", "cool" };
string first = steps[0]; // O(1) by indexAcceso por clave: Dictionary
Si busca elementos mediante un identificador único, elija Dictionary<K,V>. Asocia una clave con un valor en O(1) en promedio.
Ejemplos: del identificador de usuario al usuario, del código de país al nombre o de una palabra a su cantidad de apariciones. La clave responde a «¿cuál?», mientras que el valor contiene los datos.
var users = new Dictionary<int, string> {
[101] = "Ann",
[102] = "Bob"
};
string name = users[101];Pertenencia y unicidad: HashSet
Si solo le importa saber si un valor está presente o necesita rechazar duplicados, elija HashSet<T>. Contains es O(1) en promedio.
Ejemplos: URL visitadas, permisos permitidos o etiquetas distintas. No hay ningún valor asociado, solo la presencia del elemento.
var visited = new HashSet<string>();
if (visited.Add(url)) {
// first time seeing this url
}La tabla de costes
Costes promedio: la indexación de List es O(1), pero Contains es O(n). Las consultas de Dictionary y HashSet son O(1).
List.Add al final es O(1) amortizado; insertar o eliminar en el medio es O(n). Agregar y eliminar en Dictionary y HashSet son operaciones O(1) en promedio.
// List: index O(1), Contains O(n)
// Dictionary: by-key O(1), no index
// HashSet: Contains O(1), no value, no indexList.Contains es una mala señal
Llamar repetidamente a list.Contains dentro de un bucle es una trampa O(n²). Cada comprobación recorre toda la lista.
Si las comprobaciones de pertenencia predominan, cambie a un HashSet. Este único cambio puede convertir un bucle lento en uno instantáneo con grandes volúmenes de datos.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var allow = new HashSet<int> { 2, 4, 6 };
foreach (int n in new[] { 1, 2, 3, 4 })
if (allow.Contains(n)) Console.Write(n + " ");
}
}Cuando necesita clave y orden
¿Necesita buscar por clave, pero también un orden predecible? Un Dictionary estándar no garantiza el orden.
Considere mantener una List para el orden junto con un Dictionary para las consultas, o utilice SortedDictionary<K,V> para conservar las claves ordenadas, con un coste de O(log n).
var sorted = new SortedDictionary<string, int>();
sorted["b"] = 2;
sorted["a"] = 1;
// enumerates a then b, in key orderCompensaciones de memoria
Las colecciones basadas en hash intercambian memoria por velocidad. Dictionary y HashSet mantienen cubetas internas, por lo que utilizan más memoria que una List compacta o un array.
Para colecciones pequeñas con unos pocos elementos, recorrer una List puede ser perfectamente válido y utiliza menos memoria. El hashing resulta rentable a gran escala.
Programe contra interfaces
Las firmas de métodos deben aceptar el tipo menos específico que funcione. Acepte IEnumerable<T> para leer, IReadOnlyList<T> para lecturas indexadas e IDictionary<K,V> para acceder por clave.
Esto desacopla a los llamadores de su elección concreta y le permite cambiar las implementaciones más adelante sin romper las firmas.
int Sum(IEnumerable<int> values) {
int total = 0;
foreach (int v in values) total += v;
return total;
}Un ejemplo completo
Contar palabras únicas en un texto utiliza dos colecciones conjuntamente. Un HashSet realiza el seguimiento de las palabras vistas y un Dictionary lleva la cuenta de las apariciones.
Cada una cumple bien su función: el conjunto impone la unicidad y el diccionario asocia cada palabra con su frecuencia, ambas operaciones en O(1) en promedio.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var counts = new Dictionary<string, int>();
foreach (var w in "a b a c b a".Split(' '))
counts[w] = counts.GetValueOrDefault(w) + 1;
Console.WriteLine(counts["a"]); // 3
}
}Lista de comprobación para decidir
Pregúntese, en este orden: ¿necesito un mapa de clave a valor? Utilice Dictionary. ¿Solo necesito unicidad o pertenencia? Utilice HashSet.
En caso contrario, ¿necesito orden y acceso por índice, posiblemente con duplicados? Utilice List. Esta breve lista cubre la mayoría de los casos cotidianos.
Comprobación rápida
Aplique la lista de comprobación para decidir a una necesidad concreta.
Resumen
Elija según el patrón de acceso: List para secuencias ordenadas e indexadas; Dictionary para consultas de clave a valor; HashSet para unicidad y pertenencia.
Preste atención a Big-O: evite List.Contains en bucles críticos, aproveche las consultas hash O(1) y programe contra interfaces para mantener la flexibilidad de su elección.
Preguntas frecuentes
¿La lección «Elegir una colección» es gratis?
Sí — el texto completo de «Elegir una colección» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Elegir una colección»?
Equilibrios y rendimiento Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Elegir una colección»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- List en la práctica
- Búsquedas en Dictionary
- HashSet y unicidad
- Elegir una colección