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?

NecesidadUsaPor qué
Huecos fijos, matemática de índices, rendimientoT[]El más pequeño y rápido, sin redimensionar
"Una lista de cosas" que crece y encogeList<T>La opción por defecto en C# moderno
Buscar por nombre/id, no por posiciónDictionary<K,V>Búsqueda instantánea por clave
Solo recorrer una vezcualquiera + foreachSin necesidad de índice

Practica ahora