Lección 8 · ~12 min · ← Lección 7
Colecciones: arrays, List, Dictionary
Casi todo programa es "guardar un montón de cosas y luego hacer algo con ellas". Los tres caballos de batalla de C# cubren el 95%: el array (tamaño fijo, el más rápido), la List<T> (crece) y el Dictionary (busca por clave).
Array: una fila de cajas, tamaño fijo al nacer
int[] puntos = new int[3]; // exactamente 3 huecos, decididos aquí
puntos[0] = 72;
puntos[1] = 95;
puntos[2] = 88;
int total = 0;
for (int i = 0; i < puntos.Length; i++) // los arrays usan .Length
{
total += puntos[i];
}
Console.WriteLine("total: " + total + " cuenta: " + puntos.Length);
Los índices empiezan en 0, así que el último hueco es Length - 1 — pásate y tendrás IndexOutOfRangeException en ejecución. Forma corta cuando conoces los valores: int[] puntos = { 72, 95, 88 };
List<T>: la misma fila de cajas, crece a demanda
var nombres = new List();
nombres.Add("Ada");
nombres.Add("Grace");
nombres.Add("Linus");
Console.WriteLine(nombres.Count); // List usa .Count, no .Length
nombres.RemoveAt(0); // quitar por índice — el array no puede
Console.WriteLine(string.Join(", ", nombres));
El <string> es un argumento de tipo: esta lista guarda strings y el compilador lo impone. Add, Remove, Contains, IndexOf, Sort, Reverse — la caja de herramientas diaria. Nota .Count aquí frente a .Length para arrays; confundirlos no es grave, el mensaje de error te recordará (CS1061).
Dictionary: sin índices — busca por CLAVE
var edades = new Dictionary(); // claves string, valores int
edades["Ada"] = 36; // añade o actualiza por clave
edades["Grace"] = 45;
Console.WriteLine(edades["Ada"] + edades["Grace"]);
foreach (string k in edades.Keys) // recorre las claves
{
Console.WriteLine(k + " -> " + edades[k]);
}
if (edades.TryGetValue("Linus", out int edad)) // la búsqueda segura
{
Console.WriteLine(edad);
}
else
{
Console.WriteLine("Linus no encontrado");
}
Una trampa: leer una clave inexistente con edades["Linus"] lanza KeyNotFoundException — por eso existe TryGetValue. Es la versión diccionario de int.TryParse: intenta la búsqueda, ramifica según el éxito.
foreach funciona sobre los tres
int[] arr = { 72, 95, 88 };
var lista = new List { 1, 2, 3 };
foreach (int x in arr) Console.Write(x + " ");
foreach (int x in lista) Console.Write(x + " ");
(El diccionario necesita foreach sobre .Keys/.Values en este motor — los pares KeyValuePair están en la hoja de ruta.)
¿Cuál, cuándo?
| Necesidad | Usa | Por qué |
|---|---|---|
| Huecos fijos, matemática de índices, rendimiento | T[] | El más pequeño y rápido, sin redimensionar |
| "Una lista de cosas" que crece y encoge | List<T> | La opción por defecto en C# moderno |
| Buscar por nombre/id, no por posición | Dictionary<K,V> | Búsqueda instantánea por clave |
| Solo recorrer una vez | cualquiera + foreach | Sin necesidad de índice |
Practica ahora
- Construye una
List<int>de 5 puntuaciones e imprime el promedio como double — cuidado con la trampa de la división entera al dividir. - Construye un diccionario con 3 nombres de usuario y sus puntuaciones; imprime los tres y luego busca con seguridad uno que no existe.
- Siguiente lección: Lección 9 — Excepciones.