2009-03-17 19 views
247

En Perl, puedo omitir una iteración de foreach (o cualquier ciclo) con un comando next;.¿Cómo omito una iteración de un ciclo `foreach`?

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

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

    // otherwise process number 
} 
+0

¡Avisar al usuario con su mala información es tan importante como omitirla! – usefulBee

Respuesta

514

que desee:

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

    // do work 
} 

Aquí hay más información sobre el continue keyword.


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

Podría aclarar aún más de lo que haría si hubiera anidado para los bucles, y quería saltar 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)? 
    } 
} 

Un continue siempre se aplica al ámbito de inclusión más cercano, por lo que no se podría utilizar para salir del bucle más externo. Si surge una condición así, necesitarás hacer algo más complicado dependiendo de exactamente lo que quieras, como break desde el lazo interno, luego continue en el lazo externo. Vea aquí la documentación en el break keyword. La palabra clave break C# es similar a la palabra clave Perl last.

Además, considerar la adopción de la sugerencia de Dustin simplemente 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. 
    } 
} 
+0

¿Podría aclarar aún más qué haría si hubiera anidado bucles y quisiera omitir la iteración de uno de los extendidos? ejemplo: para (números int [] en numberarrays) { para (int numero en números) { // Qué hacer si quiere saltar los (números/numberarrays) } } – Brian

+0

C# 's 'goto' es realmente útil para la situación sobre la que Brian pregunta. Agregue una etiqueta como 'nextArray:' en la parte inferior del bucle externo, y luego 'goto nextArray;' cuando quiera saltar a ella. –

17
foreach (int number in numbers) 
{ 
    if (number < 0) 
    { 
     continue; 
    } 

    //otherwise process number 
} 
7

Uso de la sentencia continue:

foreach(object o in mycollection) { 
    if(number < 0) { 
     continue; 
    } 
    } 
+3

No entiendo por qué está subido de categoría, esto es incorrecto ya que coloca el cursor sobre "o", no "número" – Fortune

+0

De acuerdo, ¿quizás esto es una copia/pega de respuestas anteriores? Conceptualmente valioso, ya que es un foreach, pero asegúrese de que las variables sean consistentes. –

12

Puede utilizar la instrucción continue.

Por ejemplo:

foreach(int number in numbers) 
{ 
    if(number < 0) 
    { 
     continue; 
    } 
} 
23

También podría voltear si la prueba:


foreach (int number in numbers) 
{ 
    if (number >= 0) 
    { 
     //process number 
    } 
} 
+0

:) ¡Gracias! Se me ocurrió un ejemplo básico porque había algunos criterios al principio del ciclo que no necesitarían ser procesados, y otros que eran errores que debían capturarse. – Brian

+0

+1 por no usar 'continuar' – Trap

+4

No use más ifs :( – Custodio

43

Otro enfoque es el de filtrar utilizando LINQ antes de que el bucle se ejecuta:

foreach (int number in numbers.Where(n => n >= 0)) 
{ 
    // process number 
} 
+2

+1. Aunque no es una respuesta directa a la pregunta, en la práctica probablemente preferiría esta solución a la que propuse. Usar LINQ parece ser un buen caso de uso general para filtrar valores de ciclo que no desea procesar. –

+3

¿Esto es más ordenado o no? ¿Será realmente más rápido en cuanto a que hay menos para foreach? Supongo que LINQ está muy optimizado, pero la sección LINQ tendrá que foreach en algún punto tan teóricamente si el conjunto de datos es grande y el subconjunto 'filtrado' resultante es casi tan grande, ¿entonces esto será más lento ya que un foreach tiene que ocurrir dos veces? ¿Entonces tal vez depende del subdataet resultante resultante? – Coops

12

Otro enfoque utilizando linq es:

foreach (int number in numbers.Skip(1)) 
{ 
    // process number 
} 

Si desea omitir el primero en una serie de elementos.

O use .SkipWhere si desea especificar una condición para omitir.

Cuestiones relacionadas