I am having trouble figuring out how to break out of a loop that contains a switch statement. Break breaks out of the switch, not the loop.
There is probably a more elegant solution to this. I have implemented a flag that starts out as true and gets set to false and ends the loop. Can you offer a better solution?
Background: this code is used in a bar code workflow system. We have PocketPCs that have bar code scanners built in. This code is used in one of those functions. It prompts the user for different pieces of data throughout the routine. This piece allows them to scroll through some inventory records displaying that info on the PocketPC terminal (paged results) and allows them to enter "D" for Done, "Q" to quit.
Here is the current C# example that needs to be improved:
do
{
switch (MLTWatcherTCPIP.Get().ToUpper())
{
case "": //scroll/display next inventory location
MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown();
break;
case "P": //scroll/display previous inventory location
MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown();
break;
case "D": //DONE (exit out of this Do Loop)
// break; // this breaks out of the switch, not the loop
// return; // this exists entire method; not what I'm after
keepOnLooping = false;
break;
case "Q": //QUIT (exit out to main menu)
return;
default:
break;
}
} while (keepOnLooping);
Here is an example of code that does this in VB.NET
Do
Select Case MLTWatcherTCPIP.Get().ToUpper
Case "" ''#scroll/display next inventory location
MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown()
Case "P" ''#scroll/display previous inventory location
MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextUp()
Case "D" ''#DONE (exit out of this Do Loop)
Exit Do
Case "Q" ''#QUIT (exit out to main menu)
Return
End Select
Loop
Thanks,
Another (not so great) alternative is to uniquely handle the
case
where you have to "break out of the loop" with anif
straight away and move it out of theswitch
block. Not terribly elegant if the switch-case is very long:You can also make the
case
itself a part of the condition ofwhile
loop considering you only have to break out of the loop and the computation of expression itself is trivial (like reading a variable).Also if refactoring the entire thing into a new method (which is the most elegant solution to this) is unacceptable for some reason, then you can also rely on an anonymous delegate to do the same inside the existing method.
You must use a goto statement for multi level breaks. It appears to be the only 'clean' way in C#. Using a flag is also useful, but requires extra code if the loop has other predicaments for running.
http://msdn.microsoft.com/en-us/library/aa664756(VS.71).aspx
It may be interesting to note that some other non-c languages have multi level breaks by doing
break levels;
(Java is just as useless, though, as it uses a goto disguised as a continue.. :P)I find this form to be ever-so-slightly more readable: