Pregunta

En C# (siéntase libre de respuesta para otros idiomas) bucle, ¿cuál es la diferencia entre el break y continue como un medio para salir de la estructura del bucle, y pasar a la siguiente iteración?

Ejemplo:

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

Solución

break va a salir del bucle completamente, continue sólo skip la iteración actual.

Por ejemplo:

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

    DoSomeThingWith(i);
}

El salto va a hacer que el bucle de salida en la primera iteración - DoSomeThingWith no se ejecuta nunca.Este de aquí:

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

    DoSomeThingWith(i);
}

No se ejecutará DoSomeThingWith para i = 0, pero el bucle se continuar y DoSomeThingWith será ejecutado por i = 1 a i = 9.

Otros consejos

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

break loop - bucle se rompe y se detiene.

continue loop - bucle continúa la ejecución con la siguiente iteración.

romper hace que el contador de programa a saltar fuera del ámbito de aplicación del bucle más profundo

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

Obras como esta

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

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

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

    printf("%d", i);
}

Obras como esta

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

    printf("%d", i);

    CONTINUE:;
}

break iba a detener el foreach bucle completamente, continue iba a saltar a la siguiente DataRow.

Yo solía siempre confundo si debo utilizar romper, o continuar.Esto es lo que me ayuda a recordar:

Cuando el uso de break vs continuar?

  1. Romper - es como romper.Es triste, ustedes son de despedida.

Break

  1. Continuar - significa que vas a dar hoy un descanso y ordenar todo el día de mañana (es decir,saltar de la iteración actual)!

Continue

Hay más de un par de personas que no les gusta break y continue.La última queja que vi de ellos fue en JavaScript:Las Partes Buenas por Douglas Crockford.Pero me parece que a veces el uso de uno de ellos realmente simplifica las cosas, especialmente si su idioma no incluye una do-while o do-until estilo de bucle.

Yo tiendo a usar break en los bucles que están buscando una lista para algo.Una vez encontrado, no hay ningún punto en continua, por lo que bien podría dejar.

Yo uso continue cuando se hace algo con la mayoría de los elementos de una lista, pero todavía quiere saltar un par de.

El break la declaración también es útil cuando una votación para una respuesta válida de alguien o de algo.En lugar de:

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

Usted podría eliminar la duplicidad y uso:

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

El do-until bucle que he mencionado antes es la solución más elegante para ese problema en particular:

Do:
    Ask a question
    Until the answer is valid

No duplicación, y no break necesaria.

Todos han dado una explicación muy buena.Todavía estoy publicando mi respuesta sólo para dar un ejemplo si que 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á el resultado:

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

3[Impreso] Y 4[Impreso] no se muestra como no hay 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á el resultado:

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

3[Impreso] no se muestra como hay que continuar cuando i == 3

Romper

Romper las fuerzas de un bucle para salir de inmediato.

Continuar

Este hace lo contrario de descanso.En lugar de terminar el bucle, inmediatamente bucles de nuevo, omitiendo el resto del código.

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 interrupción 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.

Sustituir el descanso, con un cont.

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

    Console.WriteLine(i);
}

Ahora bucle imprime 1 y 3 (salta 2).

Por lo tanto, break se detiene el bucle, mientras que continue salta a la siguiente iteración.

Ruby, por desgracia, es un poco diferente.PS:Mi memoria es un poco confusa en este así que disculpas si estoy equivocado

en lugar de pausa/continuar, tiene pausa/siguiente, que se comportan de la misma en términos de bucles

Bucles (como todo lo demás) son expresiones, y "devolver" la última cosa que ellos hicieron.La mayoría del tiempo, obteniendo el valor de retorno de un bucle es inútil, así que todo el mundo hace esto

a = 5
while a < 10
    a + 1
end

Sin embargo, puede hacer esto

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

Sin EMBARGO, una gran cantidad de código ruby 'emule' un bucle mediante el uso de un bloque.El ejemplo canónico es

10.times do |x|
    puts x
end

Como es mucho más común que la gente quiere hacer las cosas con el resultado de un bloque, esto es donde se pone complicado.pausa/siguiente significar diferentes cosas en el contexto de un bloque.

romper saltar de el código que llama el bloque de

a continuación te salte el resto del código en el bloque, y la "devolución" de lo que se especifica para el autor de la llamada 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 impresionante, pero tiene unos horribles esquina de los casos.Este es el segundo peor que he visto en mis años de usarlo :-)

Respuesta Simple:

Romper sale del bucle inmediatamente.
Continuar comienza a procesar el siguiente elemento.(Si hay alguna, saltando a la evaluación de línea de la for/while)

Por favor, permítanme decir lo obvio:tenga en cuenta que agregar ni romper ni continuar, reanudará su programa;es decir,Yo atrapado por un cierto error, a continuación, después de iniciar sesión, me quería reanudar el procesamiento, y hubo más de código de tareas entre la fila de al lado, así que simplemente lo dejo caer.

Para romper completamente fuera de un bucle foreach, romper se utiliza;

Para ir a la siguiente iteración del bucle, continuar se utiliza;

Romper es útil si usted está en bucle a través de una colección de Objetos (como las de Filas en una tabla de datos) y usted está buscando para un partido en particular, cuando usted encuentra que coinciden, no hay necesidad de continuar a través de las filas restantes, por lo que usted desea romper.

Continuar es útil cuando usted ha logrado lo que usted necesita en el lado de una iteración del bucle.Que normalmente tienen continuar después de un si.

si usted no desea utilizar romper usted acaba de aumentar el valor de I en tal manera que hacen que la iteración condición falsa y bucle no se ejecutará en la siguiente 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
}

Como en otras lenguas:

'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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top