¿Cómo me salto una iteración de un bucle "foreach"?

Resuelto Brian asked hace 15 años • 8 respuestas

En Perl puedo omitir una iteración foreach (o cualquier bucle) con un next;comando.

¿Hay alguna manera de omitir una iteración y pasar al siguiente bucle en C#?

 foreach (int number in numbers)
 {
     if (number < 0)
     {
         // What goes here to skip over the loop?
     }

     // otherwise process number
 }
Brian avatar Mar 17 '09 19:03 Brian
Aceptado

Quieres:

foreach (int number in numbers) //   <--- go back to here --------+
{                               //                                |
    if (number < 0)             //                                |
    {                           //                                |
        continue;   // Skip the remainder of this iteration. -----+
    }

    // do work
}

Aquí encontrará más información sobre la continuepalabra clave .


Actualización: en respuesta a la pregunta de seguimiento de Brian en los comentarios:

¿Podría aclarar más qué haría si hubiera anidado bucles for y quisiera omitir la iteración de uno de los extendidos?

for (int[] numbers in numberarrays) {
  for (int number in numbers) { // What to do if I want to
                                // jump the (numbers/numberarrays)?
  }
}

A continuesiempre se aplica al ámbito circundante más cercano, por lo que no puede usarlo para salir del bucle más externo. Si surge una condición como esa, necesitarás hacer algo más complicado dependiendo exactamente de lo que quieras, como breakdesde el bucle interior y luego continuedesde el bucle exterior. Consulte aquí la documentación sobre la breakpalabra clave . La breakpalabra clave C# es similar a la lastpalabra clave Perl.

Además, considere seguir la sugerencia de Dustin de filtrar los valores que no desea procesar de antemano:

foreach (var basket in baskets.Where(b => b.IsOpen())) {
  foreach (var fruit in basket.Where(f => f.IsTasty())) {
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue
                           // since all the fruits that reach this point are
                           // in available baskets and tasty.
  }
}
John Feminella avatar Mar 17 '2009 13:03 John Feminella

Otro enfoque es filtrar usando LINQ antes de que se ejecute el bucle:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}
Dustin Campbell avatar Mar 17 '2009 13:03 Dustin Campbell

También puedes voltear tu prueba if:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }
crashmstr avatar Mar 17 '2009 13:03 crashmstr
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}
Tamas Czinege avatar Mar 17 '2009 12:03 Tamas Czinege