C# bucle de salto vscontinuar
-
08-06-2019 - |
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;
}
}
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?
- Romper - es como romper.Es triste, ustedes son de despedida.
- 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)!
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