Satuin törmäämään ohjelmoidessani seuraavanlaiseen ongelmaan: minulla on while loop, joka loppuu kun esiintyy komento break;.
while(true) { string komento = Console.ReadLine(); if(komento == "lopeta") break; }
Ohjelmassa voi antaa komennon ja switch -rakenne käy vaihtoehdot läpi. Mutta huomasin, että switch rakenteeseen en voi sijoittaa break; komentoa.
while(true) { string komento = Console.ReadLine(); switch(komento) { case "lopeta": break; //tämän pitäisi lopettaa while -loop break; //tämän taas pitäisi lopettaa case "lopeta". } }
Siis tuollalailla ei voi tehdä, että on kaksi break; komentoa. Siis voihan tämän helposti tehdä tuon if -lauseen sisään, mutta kiinnostaisi onko mahdollista saada jotenkin sijoitettua tuonne switchiin.
AtskaFin kirjoitti:
huomasin, että switch rakenteeseen en voi sijoittaa break; komentoa.
Voithan, se poistuu sieltä switch-rakenteesta. break-komentoi poistuu aina itseään lähimmästä rakenteesta, jossa voi käyttää breakia.
Sinänsä ihan sama tilanne on minkä tahansa muunkin rakenteen kanssa, josta halutaan poistua breakilla: Voit poistua vain yhden tason
Itse varmaan tekisin niin että tuon lopeta-tapauksen pitäisin erikseen if:nä tai sitten laittaisin koko while-loopin funktioksi ja poistuisin siitä kokonaan.
Yksi vaihtoehto on myös että teet totuusarvon (boolean muuttuja), mutta mielestäni tämä on huonompi kuin edelliset.
Sinänsä jos ihan välttämättä haluat poistua useramman breakin kerralla niin käsky on nimeltään goto, mutta en suosittele käyttämään sitä. (Ja goton mainitsemisestakin sit varmaan tulee vihaviestejä minullekin..)
while (true) { string komento = Console.ReadLine(); switch (komento) { case "lopeta": goto lopeta; case "heippa": Console.WriteLine("No moro moro"); break; } } lopeta: { }
Tässä eri tapoja lopettaa kaksoissilmukka: https://stackoverflow.com/questions/982595/how-to-break-out-of-2-loops-without-a-flag-variable-in-c
Aihe on jo aika vanha, joten et voi enää vastata siihen.