C# loop - break vs.continuar
-
08-06-2019 - |
Pergunta
Em C# (sinta-se livre para responder para outros idiomas) loop, qual é a diferença entre ruptura e continuar como um meio para deixar a estrutura do loop, e vá para a próxima iteração?
Exemplo:
foreach (DataRow row in myTable.Rows)
{
if (someConditionEvalsToTrue)
{
break; //what's the difference between this and continue ?
//continue;
}
}
Solução
break
vai sair do loop completamente, continue
só vai pular a iteração atual.
Por exemplo:
for (int i = 0; i < 10; i++) {
if (i == 0) {
break;
}
DoSomeThingWith(i);
}
O break fará com que o loop para sair na primeira iteração - DoSomeThingWith
nunca será executada.Este aqui:
for (int i = 0; i < 10; i++) {
if(i == 0) {
continue;
}
DoSomeThingWith(i);
}
Não será executado DoSomeThingWith
para i = 0
, mas o loop continuar e DoSomeThingWith
será executada para i = 1
para i = 9
.
Outras dicas
Uma forma muito fácil de entender isso é colocar a palavra "loop" depois de cada uma das palavras-chave.Os termos agora faz sentido se eles são apenas de leitura como diário frases.
break
loop - loop é quebrado e pára.
continue
loop - loop continua a executar com a próxima iteração.
quebra faz com que o contador de programa para saltar fora do escopo do loop mais interno
for(i = 0; i < 10; i++)
{
if(i == 2)
break;
}
Funciona assim
for(i = 0; i < 10; i++)
{
if(i == 2)
goto BREAK;
}
BREAK:;
continuar salta para o fim do loop.Em um loop for, continue salta para o incremento de expressão.
for(i = 0; i < 10; i++)
{
if(i == 2)
continue;
printf("%d", i);
}
Funciona assim
for(i = 0; i < 10; i++)
{
if(i == 2)
goto CONTINUE;
printf("%d", i);
CONTINUE:;
}
break
gostaria de parar o foreach
loop completamente, continue
gostaria de passar para o próximo DataRow
.
Eu costumava sempre ficar confuso se devo usar quebrar, ou continuar.Isso é o que me ajuda a lembrar:
Quando usar quebrar vs continuar?
- Quebra - é como se quebrando.É triste, vocês são os cortes.
- Continuar - significa que você vai dar, hoje, um resto de classificação e de tudo para amanhã (i.e.pular a iteração atual)!
Há mais do que algumas pessoas que não gostam de break
e continue
.A última queixa que eu vi sobre eles era em JavaScript:As Partes Boas por Douglas Crockford.Mas eu acho que, às vezes, usando um deles realmente simplifica as coisas, especialmente se o seu idioma não inclui do-while
ou do-until
estilo do loop.
Eu tendem a usar break
em loops que estão procurando uma lista para algo.Uma vez encontrado, não há nenhum ponto em continuar, então você pode muito bem sair.
Eu uso continue
ao fazer algo com a maioria dos elementos de uma lista, mas ainda quer saltar por cima de alguns.
O break
declaração também é útil quando a pesquisa para uma resposta válida a partir de alguém ou de algo.Em vez de:
Ask a question
While the answer is invalid:
Ask the question
Você pode eliminar alguns duplicação e uso:
While True:
Ask a question
If the answer is valid:
break
O do-until
loop que eu mencionei antes, é a solução mais elegante para esse problema:
Do:
Ask a question
Until the answer is valid
Sem duplicação, e não break
necessários.
Todos deram uma boa explicação.Eu ainda estou postando a minha resposta só para dar um exemplo que se pode ajudar.
// 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] ";
}
Aqui está o resultado:
0[Impresso] 1[Impresso] 2[Impresso]
Então 3[Impresso] E 4[Impresso] não irá ser exibido como há quebra quando 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] ";
}
Aqui está o resultado:
0[Impresso] 1[Impresso] 2[Impresso] 4[Impresso]
Então 3[Impresso] não irá ser exibido como há de continuar quando i == 3
Quebra
Quebrar as forças de um loop para sair imediatamente.
Continuar
Este é o oposto do break.Em vez de terminar o ciclo, imediatamente loops novamente, ignorando o restante do código.
Por exemplo
foreach(var i in Enumerable.Range(1,3))
{
Console.WriteLine(i);
}
Imprime 1, 2, 3 (em linhas separadas).
Adicionar uma quebra de condição em i = 2
foreach(var i in Enumerable.Range(1,3))
{
if (i == 2)
break;
Console.WriteLine(i);
}
Agora o ciclo imprime 1 e pára.
Substituir a ruptura com um continue.
foreach(var i in Enumerable.Range(1,3))
{
if (i == 2)
continue;
Console.WriteLine(i);
}
Agora loop imprime 1 e 3 (pular 2).
Assim, break
interrompe o ciclo, enquanto continue
pula para a próxima iteração.
Ruby, infelizmente, é um pouco diferente.PS:A minha memória está um pouco nebulosa de tal modo desculpas se eu estou errado
em vez de pausa/continuar, ele tem quebra de/ao lado, que se comportam da mesma em termos de loops
Loops (como tudo o mais) são expressões, e "devolver" a última coisa que eles fizeram.A maior parte do tempo, obtendo o valor de retorno de um ciclo é inútil, para que todos só faz isso
a = 5
while a < 10
a + 1
end
No entanto, você pode fazer isso
a = 5
b = while a < 10
a + 1
end # b is now 10
No ENTANTO, um monte de ruby código "emula" um ciclo através da utilização de um bloco.O exemplo canônico é
10.times do |x|
puts x
end
Como é muito mais comum que as pessoas querem fazer as coisas com o resultado de um bloco, este é o lugar onde ele fica confuso.break/próxima significar coisas diferentes no contexto de um bloco.
de quebra vai saltar para fora do código que chamou o bloco
próximo irá saltar o resto do código no bloco, e 'return' o que você especificar para o chamador do bloco.Isso não faz qualquer sentido, sem exemplos.
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.
Então, sim.Ruby é incrível, mas tem alguns terríveis canto-casos.Esta é a segunda pior que eu já vi em meus anos de utilização :-)
Resposta simples:
Quebra sai do loop imediatamente.
Continuar inicia o processamento do próximo item.(Se as houver, saltando para a avaliação da linha do for/while)
Por favor, deixe-me dizer o óbvio:observe que a adição de nem quebrar, nem continuar, vai retomar o seu programa;i.e.Eu preso por um determinado erro, em seguida, depois de iniciar a sessão, eu queria retomar o processamento, e que havia mais tarefas de código entre a linha seguinte, então eu simplesmente deixá-lo cair.
Para quebrar completamente fora de um loop foreach, quebra é utilizado;
Para ir para a próxima iteração do loop, continuar é utilizado;
Quebra é útil se você está loop através de uma coleção de Objetos (como Linhas em um Datatable) e você estiver procurando por um jogo em particular, quando você encontrar o que corresponde, não há necessidade de continuar as restantes linhas, de modo que você deseja quebrar.
Continuar é útil quando você tem feito o que você precisa no lado de uma iteração do loop.Você vai ter normalmente continuar depois de uma se.
se você não quiser usar quebra você acabou de aumentar o valor de I de tal maneira que ele fazer iteração condição falsa e o loop não será executado na próxima iteração.
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 para outros 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