🎮 UnityDocs

Colecciones en C#: array, List y Dictionary

Cómo guardar muchos datos: arrays (tamaño fijo), List (dinámica) y Dictionary (pares clave-valor). Cuál usar en cada caso, cómo recorrerlos y sus trampas de rendimiento en Unity.

📄 ArtículoIntermedio✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min · ⌨️ Práctica 20 min

Guardar muchos datos#

Cuando necesitas varios valores (un inventario, la lista de enemigos, las puntuaciones), usas una colección. Las tres que cubren casi todo: array, List y Dictionary.

Array: tamaño fijo#

Rápido y ligero, pero su tamaño no cambia una vez creado.

C#
int[] puntuaciones = new int[3] { 100, 250, 90 };
Debug.Log(puntuaciones[0]);        // 100 — se cuenta desde 0
puntuaciones[1] = 300;             // modificar
Debug.Log(puntuaciones.Length);    // 3 — cuántos hay
Se empieza a contar en 0

El primer elemento es el índice 0, el segundo el 1... En un array de 3, los índices válidos son 0, 1 y 2. Acceder a puntuaciones[3] lanza IndexOutOfRangeException.

List: tamaño dinámico#

La más usada. Puedes añadir y quitar elementos sobre la marcha. Necesita using System.Collections.Generic;.

C#
using System.Collections.Generic;

List<string> inventario = new List<string>();
inventario.Add("Espada");
inventario.Add("Poción");
inventario.Remove("Espada");
Debug.Log(inventario.Count);        // cuántos elementos
Debug.Log(inventario.Contains("Poción"));  // true
Debug.Log(inventario[0]);           // acceso por índice

Dictionary: pares clave → valor#

Guarda asociaciones: una clave te da un valor, como un diccionario real. Búsqueda muy rápida por clave.

C#
using System.Collections.Generic;

Dictionary<string, int> precios = new Dictionary<string, int>();
precios["Poción"] = 50;
precios["Escudo"] = 120;

Debug.Log(precios["Escudo"]);       // 120

// Comprobar antes de acceder (evita error si no existe)
if (precios.TryGetValue("Poción", out int p))
    Debug.Log("Cuesta " + p);
Acceder a una clave inexistente lanza excepción

precios["Casco"] cuando "Casco" no existe da KeyNotFoundException. Usa TryGetValue o ContainsKey para comprobar antes. Y una clave no se puede repetir: añadir dos veces la misma con Add da error.

Cuál usar#

🧭 ¿Qué debería usar?
  • ¿Cantidad fija y conocida, máximo rendimiento? → array
  • ¿Lista que crece y mengua, acceso por posición? → List
  • ¿Buscar por una clave (nombre, id)? → Dictionary
  • ¿Solo te importa si algo está o no (sin duplicados)? → HashSet
  • ¿Cola de espera (primero en entrar, primero en salir)? → Queue

Recorrerlas#

C#
// foreach: lo más legible
foreach (string arma in inventario)
    Debug.Log(arma);

// Dictionary: clave y valor
foreach (var par in precios)
    Debug.Log(par.Key + " cuesta " + par.Value);
No modifiques una colección mientras la recorres con foreach

Añadir o quitar elementos de una lista dentro de su propio foreach lanza InvalidOperationException. Si necesitas eliminar mientras recorres, usa un for hacia atrás o recopila lo que vas a borrar y elimínalo después.

Rendimiento en Unity#

Cuidado con la basura en el bucle de juego
  • Crear listas nuevas cada frame genera basura para el recolector. Reutiliza una lista y hazle Clear() en vez de crear otra.
  • List.Remove de la mitad de la lista desplaza el resto (coste). Para muchos objetos que entran y salen, valora otras estructuras o el object pooling.
  • Recorrer un Dictionary no garantiza orden; si necesitas orden, usa List.

Errores frecuentes#

  • Salirse de rango en arrays/List (índice fuera de [0, Count-1]).
  • Acceder a una clave inexistente en un Dictionary sin comprobar.
  • Modificar una colección dentro de su foreach.
  • Olvidar using System.Collections.Generic; para List/Dictionary.
  • Crear colecciones nuevas cada frame en vez de reutilizarlas.

Ponte a prueba#

📝 Pon a prueba lo aprendido

Resumen#

Array para cantidad fija, List para colecciones que cambian, Dictionary para buscar por clave (HashSet/Queue para casos concretos). Recorre con foreach, comprueba antes de acceder (índices y claves), no modifiques durante el foreach, y cuida la basura reutilizando colecciones en el bucle de juego. Se apoyan en bucles y sostienen sistemas como inventarios y pools.

Fuentes y para profundizar