Patrón Iterator en C#: Guía Completa

Introducción: Recorrer sin conocer

Iterator permite recorrer una colección sin exponer su estructura interna, manteniendo la encapsulación intacta. Gracias a esto, puedes cambiar el tipo de colección o su implementación interna sin romper el código que itera.

Recorrido
Prompt: Path with stepping stones, minimal landscape style.

1. Naturaleza: Migración por etapas

Las aves migran siguiendo etapas. Cada paso es un "next" natural y no necesitan conocer el mapa completo para avanzar.

La ruta se divide en tramos, con descansos y puntos de referencia; el iterador funciona igual: solo expone el siguiente elemento y oculta el resto del recorrido.

Migración
Prompt: Birds flying in formation, calm sky, nature documentary style.

2. Mundo Real: Playlists

Una playlist te permite ir canción por canción sin saber cómo están almacenadas. Da igual si vienen de un archivo local, streaming o caché: el control de reproducción no cambia.

Ese desacoplamiento es el corazón del Iterator: el cliente solo usa Next y HasNext (o MoveNext) y el detalle de almacenamiento queda encapsulado.

Playlist
Prompt: Music player UI with next/prev buttons, modern flat design.

3. Implementación en C#: Código Paso a Paso

public class Coleccion
{
    private List _items = new() { "A", "B", "C" };
    public IEnumerator GetEnumerator() => _items.GetEnumerator();
}

// Uso
var coleccion = new Coleccion();
foreach (var item in coleccion) Console.WriteLine(item);

4. Iterator vs Foreach

foreach usa internamente el patrón Iterator (IEnumerator), pero el patrón te permite crear recorridos personalizados (filtrados, orden inverso, paginación).

Cuando necesitas más control que el recorrido estándar, un iterador explícito te da la libertad de definir reglas de navegación sin cambiar la colección.

5. Diagrama UML

UML Iterator
Prompt: UML diagram of Iterator pattern, clean vector layout.
Flujo de iteración
Prompt: Iteration flow diagram, minimal infographic style.

⚠️ Cuándo NO Usar Iterator

  • Si la colección es trivial y no necesitas abstracción.
  • Si el recorrido es siempre el mismo y un foreach basta.
  • Si el costo de crear iteradores supera la complejidad del problema.

💪 Ejercicio

Crea un iterador para recorrer una matriz en diagonal. Agrega una versión que permita elegir el punto de inicio y el sentido (↘︎ o ↗︎).

Conclusión

Iterator hace que recorrer colecciones sea uniforme y seguro, protegiendo la estructura interna. Es una herramienta clave cuando quieres flexibilidad de recorrido sin acoplar al cliente.