C # loop - romper vs continuar


797

En un bucle C # (siéntase libre de responder para otros idiomas), ¿cuál es la diferencia entre romper y continuar como un medio para abandonar la estructura del bucle e ir a la siguiente iteración?

Ejemplo:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}

2
publicación de blog con la culminación de adamthings.com/post/2012/07/26/…
Adam

8
continue;detendrá el procesamiento de la corriente rowy continuará con la siguiente row de la colección. Por otro lado, break;dejará la foreachdeclaración por completo y las filas restantes nunca se procesarán.
Jeppe Stig Nielsen

Respuestas:


1500

breaksaldrá del bucle por completo, continuesimplemente saltará la iteración actual.

Por ejemplo:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

La ruptura hará que el ciclo salga en la primera iteración DoSomeThingWith, nunca se ejecutará. Esto aqui:

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

No se ejecutará DoSomeThingWithpara i = 0, pero el bucle continuará y DoSomeThingWithserá ejecutado por i = 1a i = 9.


2
¿Por qué no continúan sus llaves? Sé que funciona sin ellas, pero ¿por qué?
George Willcox

52
@GeorgeWillcox Mi yo más joven y más tonto aún no había aprendido el valor de usar aparatos ortopédicos, siempre. (Son opcionales en C # para declaraciones individuales, pero no ponerlas hace que sea más fácil introducir un error más adelante. También vea programmers.stackexchange.com/a/16530/6342 )
Michael Stum

386

Una manera realmente fácil de entender esto es colocar la palabra "bucle" después de cada una de las palabras clave. Los términos ahora tienen sentido si se leen como frases cotidianas.

break loop: el loop se rompe y se detiene.

continue loop - loop continúa ejecutándose con la siguiente iteración.


105

break hace que el contador del programa salte fuera del alcance del bucle más interno

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

Funciona asi

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

continuar salta al final del ciclo. En un bucle for, continuar salta a la expresión de incremento.

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

Funciona asi

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

2
Noté que muchos bucles aquí solo usan el forbucle estándar , pero ¿funcionará esto para whilebucles pre y post probados ? La gotonotación me lleva a creerlo, pero necesito alguna verificación.
Daniel Park el

1
@Daniel, para los bucles WHILE puedes usar BREAK y CONTINUE, no hay problema.
Amila

@DanielPark Para ambos while("pre-probado") y do- while("post-probado"), después de continue;que se cumpla una declaración, lo siguiente que sucederá es que se evalúa la condición del bucle para decidir si se debe realizar una iteración adicional. Por supuesto, con break;la condición del bucle no marcada, el bucle simplemente sale completamente. Entonces, la gotoanalogía también es buena para entender este aspecto.
Jeppe Stig Nielsen

37

Siempre me confundía si debía usar break o continuar. Esto es lo que me ayuda a recordar:

¿Cuándo usar break vs continue?

  1. Descanso : es como romper. Es triste, ustedes se están separando. Se sale del bucle.

Rotura

  1. Continuar - ¡significa que vas a descansar hoy y resolverlo todo mañana (es decir, omitir la iteración actual)!

Seguir


Compartiré esto con mi compañero. Puede continuar se debe cambiar el nombre a GetOverIt, y se debe cambiar el nombre de Break a MoveOnForward. No es de extrañar que se nos llame geeks, ¿cómo tiene sentido Break? Suena destructivo Y uno que debe agregarse es STOP, o incluso mejor EndIt, solucionará muchos errores y hará que C-sharp sea realmente nítido.
Mike

En la inundación otra vez El mismo viaje de antaño era entonces Entonces cometí un gran error Intenta verlo una vez a mi manera
Talal Zahid

@TalalZahid no entiendo?
BKSpurgeon

28

breakdetendría el foreachbucle por completo, continuesaltaría al siguiente DataRow.


20

Hay más de unas pocas personas a las que no les gusta breaky continue. La última queja que vi sobre ellos estaba en JavaScript: The Good Parts por Douglas Crockford. Pero me parece que a veces el uso de uno de ellos realmente simplifica las cosas, sobre todo si la lengua no incluye una do-whileo do-untilestilo de bucle.

Tiendo a usar breaken bucles que buscan algo en una lista. Una vez encontrado, no tiene sentido continuar, por lo que es mejor que renuncies.

Lo uso continuecuando hago algo con la mayoría de los elementos de una lista, pero todavía quiero omitir algunos.

La breakdeclaración también es útil cuando se busca una respuesta válida de alguien o algo. En vez de:

Ask a question
While the answer is invalid:
    Ask the question

Podría eliminar algunas duplicaciones y usar:

While True:
    Ask a question
    If the answer is valid:
        break

El do-untilciclo que mencioné antes es la solución más elegante para ese problema en particular:

Do:
    Ask a question
    Until the answer is valid

Sin duplicación, y tampoco es breaknecesario.


13

Todos han dado una muy buena explicación. Todavía estoy publicando mi respuesta solo para dar un ejemplo si eso puede ayudar.

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

Aquí está la salida:

0 [Impreso] 1 [Impreso] 2 [Impreso]

Por lo tanto, 3 [Impreso] y 4 [Impreso] no se mostrarán, ya que hay un descanso cuando i == 3

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

Aquí está la salida:

0 [Impreso] 1 [Impreso] 2 [Impreso] 4 [Impreso]

Por lo tanto, 3 [Impreso] no se mostrará ya que hay continuación cuando i == 3


7

Rotura

La ruptura obliga a un bucle a salir inmediatamente.

Seguir

Esto hace lo contrario de descanso. En lugar de terminar el bucle, se repite inmediatamente, omitiendo el resto del código.


1
Continuar comprueba la condición del bucle también :)
Grantly

1
Continueno es lo contrario de break, breakdetiene el ciclo, continuedetiene la iteración actual.
Steven

6

Respuesta simple:

Break sale del bucle de inmediato.
Continuar comienza a procesar el siguiente elemento. (Si hay alguno, saltando a la línea de evaluación de por / mientras)


6

Por ejemplo

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

Imprime 1, 2, 3 (en líneas separadas).

Agregar una condición de descanso en i = 2

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

Ahora el bucle imprime 1 y se detiene.

Reemplace el descanso con un continuar.

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

Ahora para bucle imprime 1 y 3 (omitiendo 2).

Por lo tanto, breakdetiene el ciclo, mientras que continuesalta a la siguiente iteración.


5

Ruby desafortunadamente es un poco diferente. PD: Mi memoria es un poco confusa en esto, así que me disculpo si me equivoco

en lugar de break / continue, tiene break / next, que se comportan igual en términos de bucles

Los bucles (como todo lo demás) son expresiones y "devuelven" lo último que hicieron. La mayoría de las veces, obtener el valor de retorno de un bucle no tiene sentido, por lo que todo el mundo hace esto

a = 5
while a < 10
    a + 1
end

Sin embargo, puedes hacer esto

a = 5
b = while a < 10
    a + 1
end # b is now 10

SIN EMBARGO, una gran cantidad de código ruby ​​'emula' un bucle utilizando un bloque. El ejemplo canónico es

10.times do |x|
    puts x
end

Como es mucho más común que las personas quieran hacer cosas con el resultado de un bloqueo, aquí es donde se complica. break / next significa cosas diferentes en el contexto de un bloque.

el salto saltará del código que llamó al bloque

siguiente omitirá el resto del código en el bloque y "devolverá" lo que especifique a la persona que llama del bloque. Esto no tiene ningún sentido sin ejemplos.

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

Así que sí. Ruby es increíble, pero tiene algunos esquinas horribles. Este es el segundo peor que he visto en mis años de usarlo :-)


5

Permítanme decir lo obvio: tenga en cuenta que al no agregar ni interrumpir ni continuar, reanudará su programa; es decir, atrapé un cierto error, luego, después de registrarlo, quise reanudar el procesamiento, y hubo más tareas de código entre la siguiente fila, así que simplemente lo dejé pasar.


3

Para salir completamente de un bucle foreach, se usa el descanso ;

Para ir a la siguiente iteración en el bucle, se usa continuar ;

El salto es útil si está recorriendo una colección de objetos (como Filas en una tabla de datos) y está buscando una coincidencia particular, cuando encuentra esa coincidencia, no es necesario continuar a través de las filas restantes, por lo que desea dividir fuera.

Continuar es útil cuando ha logrado lo que necesita en una iteración de bucle. Normalmente tendrá que continuar después de un if .


2

si no desea usar break , simplemente aumente el valor de I de tal manera que haga que la condición de iteración sea falsa y el bucle no se ejecute en la próxima iteración.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

0

En cuanto a otros idiomas:

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.