C # loop - pauză vs. continuă

Într-o buclă C# (nu ezitați să răspundeți pentru alte limbi), care este diferența dintre pauză și continuă ca mijloc de a părăsi structura bucla și mergeți la următoarea iterație?

Exemplu:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
0
fr hi bn
continue; va opri procesarea rândului curent și va continua cu rândul următor din colecție. Pe de altă parte, break; va lăsa complet instrucțiunea foreach , iar rândurile rămase nu vor fi niciodată procesate.
adăugat autor Jeppe Stig Nielsen, sursa
blog post cu culminare de mai jos adamthings.com/post/2012/07/26/…
adăugat autor Adam, sursa

14 răspunsuri

break will exit the loop completely, continue will just skip the current iteration.

De exemplu:

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

    DoSomeThingWith(i);
}

Pauza va duce la ieșirea din buclă la prima repetare - DoSomeThingWith nu va fi executată niciodată. Asta aici:

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

    DoSomeThingWith(i);
}

Nu va executa DoSomeThingWith pentru i = 0 , dar bucla va continua și DoSomeThingWith > i = 1 la i = 9 .

0
adăugat
@GeorgeWillcox Sinele meu mai tânăr, mai proastă, nu învățase încă întotdeauna valoarea de folosire a bretelelor. (Acestea sunt opționale în C# pentru instrucțiuni simple, dar nu le puneți mai ușor să introducă mai târziu un bug. De asemenea, consultați programatorii. stackexchange.com/a/16530/6342 )
adăugat autor Michael Stum, sursa
De ce nu sunt în nici un fel bretele pe ele - știu că funcționează fără ele, dar de ce?
adăugat autor George Willcox, sursa

Din păcate ruby este puțin diferit. PS: Memoria mea este un pic cam tulbure, așa că îmi cer scuze dacă mă înșel

în loc de pauză / continuă, are pauză / următoarea, care se comportă la fel în termeni de bucle

Buclele (ca orice altceva) sunt expresii și "returnează" ultimul lucru pe care l-au făcut. De cele mai multe ori, obținerea valorii returnate dintr-o buclă este inutilă, așa că toată lumea face acest lucru

a = 5
while a < 10
    a + 1
end

Cu toate acestea, puteți face acest lucru

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

Totuși, o mulțime de cod ruby ​​"emulează" o buclă folosind un bloc. Exemplul canonic este

10.times do |x|
    puts x
end

Deoarece este mult mai comun ca oamenii să vrea să facă lucruri cu rezultatul unui bloc, acesta este locul în care devine dezordonat. pauză / următoare înseamnă lucruri diferite în contextul unui bloc.

pauza va sari din codul care a numit blocul

următorul va trece peste restul codului din bloc și va returna ceea ce specificați apelantului blocului. Acest lucru nu are sens fără exemple.

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.

Deci da. ruby este minunat, dar are niște cazuri îngrozitoare. Acesta este cel de-al doilea cel mai rău pe care l-am văzut în anii mei de utilizare :-)

0
adăugat

Există mai mult de câțiva oameni care nu-i plac break și continue . Ultima reclamație pe care am văzut-o despre ei a fost în JavaScript: The Good Parts de Douglas Crockford. Dar am descoperit că uneori folosirea uneia dintre ele simplifică cu adevărat lucrurile, mai ales dacă limba dvs. nu include un stil de buclă do-while sau do-until .

Tind să folosesc break în buclele care caută o listă pentru ceva. După ce a fost găsit, nu are rost să continuați, așa că puteți renunța.

Folosesc continue atunci când faci ceva cu majoritatea elementelor dintr-o listă, dar totuși doriți să săriți peste câteva.

Instrucțiunea break , de asemenea, vine la îndemână atunci când se cheamă la un răspuns valid de la cineva sau ceva. In loc de:

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

Ați putea elimina unele duplicări și utilizarea:

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

Lunga do-until pe care am menționat-o mai devreme este soluția mai elegantă pentru această problemă:

Do:
    Ask a question
    Until the answer is valid

Nu este necesară nicio dublare și nu este necesară nici o break .

0
adăugat

break would stop the foreach loop completely, continue would skip to the next DataRow.

0
adăugat

De exemplu

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

Imprimă 1, 2, 3 (pe linii separate).

Adăugați o condiție de pauză la i = 2

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

    Console.WriteLine(i);
}

Acum buclă imprimă 1 și se oprește.

Înlocuiți pauza cu o continuare.

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

    Console.WriteLine(i);
}

Acum, pentru a buclă tipărite 1 și 3 (sărind peste 2).

Astfel, break oprește buclele, în timp ce continue trece la următoarea iterație.

0
adăugat

Obișnuiau mereu să mă confuze dacă ar trebui să folosesc pauză sau să continui. Asta mă ajută să-mi amintesc:

Când să utilizați pauza vs continuați?

  1. Break - it's like breaking up. It's sad, you guys are parting.

Break

  1. Continue - means that you're gonna give today a rest and sort it all out tomorrow (i.e. skip the current iteration)!

Continue

0
adăugat

Pentru a rupe complet dintr-o buclă foreach, se utilizează break ;

Pentru a merge la iterația următoare în buclă, se utilizează continuă ;

Break is useful if you?re looping through a collection of Objects (like Rows in a Datatable) and you are searching for a particular match, when you find that match, there?s no need to continue through the remaining rows, so you want to break out.

Continue is useful when you have accomplished what you need to in side a loop iteration. You?ll normally have continue after an if.

0
adăugat

O modalitate foarte ușoară de a înțelege acest lucru este să plasați cuvântul "bucla" după fiecare dintre cuvintele cheie. Termenii au acum sens dacă sunt citiți doar ca expresii de zi cu zi.

break loop - looping is broken and stops.

continue loop - loop continues to execute with the next iteration.

0
adăugat

break causes the program counter to jump out of the scope of the innermost loop

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

Funcționează așa

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

continue jumps to the end of the loop. In a for loop, continue jumps to the increment expression.

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

    printf("%d", i);
}

Funcționează așa

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

    printf("%d", i);

    CONTINUE:;
}
0
adăugat
@DanielPark Pentru ambele în timp ce ("pretestate") și do - în timp ce continuă; declarația este îndeplinită, următorul lucru care se va întâmpla este că starea de buclă este evaluată pentru a decide dacă trebuie făcută o iterație suplimentară. Desigur, cu break; condiția buclă este nu bifată, bucla este pur și simplu ieșită complet. Deci analogia goto este bună și pentru înțelegerea acestui aspect.
adăugat autor Jeppe Stig Nielsen, sursa
Am observat că multe bucle aici folosesc doar codul standard pentru , dar acest lucru va funcționa pentru codurile pre și post testate în timp ce buclele? Notația geto mă determină să cred asta, dar am nevoie de o verificare.
adăugat autor Daniel Park, sursa
@Daniel, pentru bucle WHILE poți folosi BREAK și CONTINUE, fără probleme.
adăugat autor Amila, sursa

Răspuns simplu:

Break exits the loop immediately.
Continue starts processing the next item. (If there are any, by jumping to the evaluating line of the for/while)

0
adăugat

Toți au dat o explicație foarte bună. Încă am postarea răspunsului meu doar pentru a da un exemplu dacă acest lucru poate ajuta.

// 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] ";
}

Aici este rezultatul:

0 [Imprimat] 1 [Imprimat] 2 [Imprimat]

So 3[Printed] & 4[Printed] will not be displayed as there is break when 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] ";
}

Aici este rezultatul:

0 [Printed] 1 [Imprimat] 2 [Imprimat] 4 [Imprimat]

Deci, 3 [Printed] nu va fi afișată, deoarece nu există continuă atunci când i == 3

0
adăugat

Break

Break sporește o buclă pentru a ieși imediat.

Continuați

Acest lucru face opusul pauzei. În loc de a termina buclă, acesta bifă imediat din nou, sărind peste restul codului.

0
adăugat
Continuați să verificați și condiția de buclă :)
adăugat autor Grantly, sursa
Continue nu este opusul break , break oprește buclă, continue oprește iterația curentă.
adăugat autor Steven, sursa

dacă nu doriți să utilizați pauză , creșteți valoarea lui I în așa fel încât să facă condiția de iterare falsă și bucla nu va fi executată în următoarea iterație.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i
0
adăugat

În ceea ce privește alte limbi:

'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
0
adăugat