Su # kilpa - pertrauka vs tęsti

C # kilpoje (nedvejodami atsakykite į kitas kalbas), koks yra skirtumas tarp pertraukos ir toliau kaip priemonė palikti kilpos struktūrą ir pereiti prie kito iteracijos?

Pavyzdys:

 foreach (DataRow row in myTable.Rows) { if (someConditionEvalsToTrue) { break; //what the difference between this and continue ? //continue; } } 
617
09 авг. nustatė Seibaras 09 rug . 2008-08-09 00:49 '08 at 12:49 AM 2008-08-09 00:49
@ 13 atsakymų

break visiškai iš linijos, continue tiesiog praleisti dabartinį iteracijos.

Pavyzdžiui:

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

Atotrūkis sukels kilpą pirmoje iteracijoje - „ DoSomeThingWith “ niekada nebus vykdoma. Tai čia:

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

DoSomeThingWithi = 0 nebus vykdomas, tačiau ciklas tęsis ir DoSomeThingWith bus vykdomas i = 1 iki i = 9 .

1183
09 авг. Atsakymą pateikė Michael Stum rugpjūčio 9 d. 2008-08-09 00:51 '08 at 0:51 2008-08-09 00:51

Labai paprastas būdas suprasti tai yra žodis „kilpa“ po kiekvieno raktinio žodžio. Terminai dabar yra prasmingi, jei jie tiesiog skaitomi kaip įprastos frazės.

break ciklas - ciklas nutraukiamas ir sustoja.

border=0 Ciklo ciklas

continue toliau su kitais kartais.

340
09 авг. atsakymas, kurį pateikė JeremiahClark 09 rugpjūtis 2008-08-09 01:33 '08, 1:33 am 2008-08-09 01:33

pertrauka sukelia programos skaitiklį išeiti iš viduje esančios kilpos srities.

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

Veikia taip

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

toliau iki kilpos pabaigos. „For“ kilpoje toliau eikite į prieaugio išraišką.

 for(i = 0; i < 10; i++) { if(i == 2) continue; printf("%d", i); } 

Veikia taip

 for(i = 0; i < 10; i++) { if(i == 2) goto CONTINUE; printf("%d", i); CONTINUE:; } 
87
19 авг. atsakymas, kurį pateikė SemiColon 19 rug . 2008-08-19 23:21 '08, 11:21 val. 2008-08-19 23:21

visiškai nutraukia foreach , continue į kitą „ DataRow .

22
09 авг. Palmsey atsakymas, rugpjūčio 9 d. 2008-08-09 00:50 '08 at 0:50 2008-08-09 00:50

Yra daugiau nei keletas žmonių, kurie nemėgsta break ir continue . Paskutinis skundas, kurį mačiau apie juos, buvo „JavaScript“: „Douglas Crockford“ „Geros detalės“. Bet aš manau, kad kartais naudojant vieną iš jų tikrai lengviau, ypač jei jūsų kalba neapima „ do-while do-until ar „ do-until stiliaus.

Paprastai naudojasi break cikluose, kurie ieško sąrašo kažkam. Nusprendę tęsti darbą, todėl jūs taip pat galite išeiti.

Aš naudoju continue kai darau kažką su daugeliu sąrašo elementų, bet vis tiek noriu praleisti keletą.

break operatorius taip pat naudingas, kai apklausiamas teisingas atsakymas iš kito ar kito. Vietoj:

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

Galite pašalinti tam tikrą dubliavimą ir naudojimą:

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

do-until , kurį minėjau anksčiau, yra elegantiškesnis sprendimas šiai konkrečiai problemai:

 Do: Ask a question Until the answer is valid 

Nėra dubliavimo ir nereikia break .

17
09 авг. atsakymas duotas yukondude 09 rugpjūtis 2008-08-09 01:35 '08, 1:35 am, 2008-08-09 01:35

Kiekvienas davė labai gerą paaiškinimą. Aš vis dar skelbiu savo atsakymą ir pateikiu pavyzdį, jei tai gali padėti.

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

Čia yra rezultatas:

0 [Spausdinta] 1 [Spausdinta] 2 [Spausdinta]

Taigi, 3 [Printed] ir 4 [Printed] nebus rodomi, nes yra skirtumas, kai aš == 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] "; } 

Čia yra rezultatas:

0 [Spausdinta] 1 [Spausdinta] 2 [Spausdinta] 4 [Spausdinta]

Taigi, 3 [Printed] nebus rodomas, nes jis tęsiasi, kai aš == 3

11
21 дек. atsakymą pateikė Pritom Nandy 21 d. 2010-12-21 10:27 '10, 10:27, 2010-12-21 10:27

Kaip pavyzdį

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

Spausdinkite 1, 2, 3 (atskirose eilutėse).

Pridėti pertraukos būseną i = 2

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

Dabar ciklas spausdina 1 ir sustoja.

Pakeiskite tarpą ir toliau.

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

Dabar atlikite spausdinimo ciklą 1 ir 3 (praleidžiant 2).

Taigi break sustabdo kilpą, o continue tęsiasi iki kito iteracijos.

7
10 окт. spalio 10 d. atsakė pulkininkas Panikas . 2013-10-10 18:34 '13, 18:34, 2013-10-10 18:34

Tarpas

Pertrauka sukels kilpą iš karto.

Tęsti

Tai prieštarauja atotrūkiui. Vietoj to, kad užpildytumėte kilpą, jis nedelsdamas vėl kils, praleidžiant likusią kodo dalį.

6
28 марта '13 в 9:58 2013-03-28 09:58 atsakymą Sona pateikė kovo 13 d. 13 val. 2013-03-28 09:58

Deja, rubinas šiek tiek skiriasi. PS: Mano atmintis yra šiek tiek miglota, todėl atsiprašau, jei aš klystu.

vietoj pertraukos / tęsimo, ji turi pertrauką / kitą, kuri elgiasi taip pat pagal ciklą

Kilpos (kaip ir visa kita) yra išraiškos ir „grįžti“ paskutinis dalykas, kurį jie padarė. Dauguma laiko, kai grįžtamoji vertė gaunama iš kilpos, yra beprasmė, todėl visi tai daro.

 a = 5 while a < 10 a + 1 end 

Tačiau jūs galite tai padaryti

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

Tačiau daug rubino kodo „imituoja“ kilpą, naudodama bloką. Kanoninis pavyzdys

 10.times do |x| puts x end 

Kadangi žmonės dažniau turi kažką daryti su bloko rezultatais, čia jis tampa nepastovus. pertrauka / kitas reiškia skirtingus dalykus blokų kontekste.

pertrauka išeis iš kodo, vadinamo bloku

kitas bus praleisti likusią kodo dalį bloke ir „grįžti“, ką pasakysite skambinančiajam. Be pavyzdžių nėra prasmės.

 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 "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. 

Taigi taip. Rubinas yra nuostabus, tačiau jis turi baisių kampinių spintų. Tai antras blogiausias iš tų, kuriuos mačiau per savo metus: -)

5
09 авг. Orion Edwards atsakymas, rugpjūčio 9 d. 2008-08-09 05:31 '08, 5:31, 2008-08-09 05:31

Leiskite man išreikšti akivaizdžią: atkreipkite dėmesį, kad pridedant nei pertraukos, nei tęsimo, jūsų programa nebus atnaujinta; tai yra, aš nukrito į spąstus dėl tam tikros klaidos, o užsiregistravęs norėjau tęsti apdorojimą, o tarp kitos eilutės buvo dar keletas kodo užduočių, todėl aš tiesiog tegul nepavyko.

4
23 марта '09 в 21:23 2009-03-23 21:23 atsakymas pateikiamas „ Cinco“ kovo 23 d. , 09:21 21:23 2009-03-23 ​​21:23

Paprastas atsakymas yra:

Pertrauka užbaigia ciklą.
Tęsti prasideda kito elemento apdorojimas. (Jei jie yra, šokinėjimas į vertinimo eilutę /)

4
22 окт. Atsakymą Maltrap pateikė spalio 22 d. 2008-10-22 12:11 '08 12:11 val. 2008-10-22 12:11

Jei norite visiškai išeiti iš foreach kilpos, naudokite pertrauką ;

Jei norite tęsti sekančią kilpą, naudokite toliau ;

Skirtumas yra naudingas, jei susiejate objektų rinkinį (pvz., Stygos „Datatable“), ir ieškote tam tikros rungtynės, kai surasite šį atitikmenį, nereikia tęsti likusių eilučių, todėl norite išlaisvinti.

Tęsimas yra naudingas, kai baigsite tai, ko jums reikės ciklo iteracijos pusėje. Ar paprastai tęsiate po , jei .

3
09 марта '13 в 15:50 2013-03-09 15:50 atsakymą pateikė Gopesh Sharma, kovo 13 d., „13, 15:50 2013-03-09 15:50

jei nenorite naudoti pertraukos , jūs tiesiog padidinsite i vertę taip, kad ji sukelia iteracijos sąlygą melagingą ir kilpa nebus vykdoma kitą kartą.

 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 } 
2
03 февр. Atsakymą pateikė Umair Khalid 03 vasaris. 2016-02-03 09:18 '16 at 9:18 AM 2016-02-03 09:18

Kiti klausimai apie arba Užduoti klausimą