Saltar a contenido

1.6 Bucles: for, foreach y while

Un bucle repite un bloque de código. En C# hay cuatro formas: for, foreach, while y do-while.

for: cuando sabes cuántas veces

for (int i = 1; i <= 5; i++)
{
    Console.WriteLine($"Número: {i}");
}
Parte Qué hace
int i = 1 Inicio: se ejecuta una vez, antes de empezar
i <= 5 Condición: se comprueba antes de cada vuelta; si es falsa, el bucle termina
i++ Avance: se ejecuta al final de cada vuelta
{ ... } Lo que se repite

foreach: recorrer una colección

var nombres = new List<string> { "Ana", "Luis", "Eva" };
foreach (string nombre in nombres)
{
    Console.WriteLine(nombre);
}

foreach recorre todos los elementos de una colección, un array o un texto, sin que te ocupes del índice. No se puede cambiar la colección mientras se recorre con foreach.

Rangos de números

C# no tiene una forma abreviada como 1..5 para el bucle, pero se pueden generar números con Enumerable.Range(inicio, cantidad):

foreach (int n in Enumerable.Range(1, 5))     // 1, 2, 3, 4, 5  (empieza en 1 y da 5 valores)
{
    Console.WriteLine(n);
}

Variantes de for

for (int i = 5; i >= 1; i--) Console.WriteLine(i);     // descendente
for (int i = 1; i <= 10; i += 2) Console.WriteLine(i); // de dos en dos
for (int i = 1; i < 5; i++) Console.WriteLine(i);      // sin llegar a 5

Para recorrer con índice, sigue siendo lo más claro un for sobre la longitud:

var nombres = new List<string> { "Ana", "Luis", "Eva" };
for (int i = 0; i < nombres.Count; i++)
{
    Console.WriteLine($"{i}: {nombres[i]}");
}

Comparación rápida

Característica for foreach
Cuándo Sabes cuántas vueltas, o necesitas el índice Recorrer todos los elementos
break / continue Sí Sí
Modificar la colección mientras recorre Posible con cuidado No (lanza una excepción)
Legibilidad Más ruido (inicio, condición, avance) Muy clara

while y do-while

int cuenta = 3;
while (cuenta > 0)          // comprueba antes
{
    Console.WriteLine(cuenta--);
}

int intentos = 0;
do                          // se ejecuta al menos una vez
{
    intentos++;
    Console.WriteLine($"Intento {intentos}");
} while (intentos < 3);

Cortar un bucle con una variable de control

Una forma sencilla de parar un bucle sin break: una variable booleana (una bandera) que el bucle consulta en su condición. Cuando pasa lo que buscas, la pones en false.

bool activo = true;
int i = 1;

while (activo)
{
    Console.WriteLine(i);
    if (i == 5)
    {
        activo = false;    // se cumple la condición: el bucle se detiene
    }
    i++;
}
Opcional: break y continue

Existen y funcionan igual que en Java, pero no son imprescindibles: casi siempre se puede escribir lo mismo con una variable de control.

for (int i = 1; i <= 10; i++)
{
    if (i == 3) continue;   // salta esta vuelta
    if (i == 6) break;      // sale del bucle
    Console.WriteLine(i);   // 1, 2, 4, 5
}