打破包含switch语句的while循环

jos*_*air 54 c# break while-loop

我无法弄清楚如何打破包含switch语句的循环.断开了开关,而不是循环.

对此可能有更优雅的解决方案.我已经实现了一个标志,该标志以true开头并设置为false并结束循环.你能提供更好的解决方案吗?

背景:此代码用于条形码工作流程系统.我们有内置条形码扫描仪的PocketPC.此代码用于其中一个功能.它会在整个例程中提示用户输入不同的数据.这件作品允许他们滚动显示在PocketPC终端上显示该信息的一些库存记录(分页结果)并允许他们输入"D"表示完成,"Q"表示退出.

这是当前需要改进的C#示例:

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);
Run Code Online (Sandbox Code Playgroud)

这是在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
Run Code Online (Sandbox Code Playgroud)

谢谢,

Kev*_*ose 44

我试着避免它,但你可以使用......

然而,如果您选择这样做,那些带干草叉的愤怒小怪会成为职业危害.

  • 超过 15 年的经验告诉我,有时 goto 是最好的、快速的和优化的选择,将算法保留在一个小地方:保持快速、高效、原子,而不会将其破坏成千块,减少不必要的调用。示例,声波分析,机器视觉,实时等。标志不会使其变慢,我认为这是不可能的,但许多标志可能会成为读取问题。 (6认同)

Jef*_*dge 42

我发现这种形式更具可读性:

bool done = false;
while (!done) 
{ 
    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) 
            done = true;
            break; 
        case "Q": //QUIT (exit out to main menu) 
            return; 
        default: 
            break; 
    } 
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 30

这里的一个选择是将此循环重构为方法("提取方法"),并使用return.


McA*_*den 12

我所知道的另一种方式是可怕的转到. MSDN也说过这个.

但是,我认为没有理由在这种情况下使用它.您实现的方式工作正常,并且比goto更易于维护.我会保留你拥有的东西.

  • 虽然`goto`可能很可怕,但是有少数情况下它实际上是有用的,我相信这是其中之一. (9认同)

Tor*_*amo 10

您必须使用goto语句进行多级中断.它似乎是C#中唯一"干净"的方式.使用标志也很有用,但如果循环有其他运行困境,则需要额外的代码.

http://msdn.microsoft.com/en-us/library/aa664756(VS.71).aspx

值得注意的是,其他一些非c语言也有多层次的中断(Java虽然无用,因为它使用goto伪装成一个继续......:P)break levels;


Jef*_*ron 8

为什么不将开关包装成一个返回布尔值以保持循环的方法?这样可以使代码更具可读性.有人写了一篇论文,说我们毕竟不需要goto语句;)

do
{
    bool keepOnLooping = TryToKeepLooping();
} while (keepOnLooping);

private bool TryToKeepLooping()
{
    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
            return false;
        case "Q": //QUIT (exit out to main menu)
            return true;
        default:
            break;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*ver 7

你不能轻易跳出外循环,但你可以continue

如果你颠倒你的逻辑,那么你就会明白这一点。注意break在 switch 语句之后有一个立即退出循环。

在我看来,这不是很易读的代码,我认为标记仍然是最好的。

   do
         {
            switch (Console.ReadKey().KeyChar.ToString())
            {
                case "U":
                    Console.WriteLine("Scrolling up");
                    continue;

                case "J":
                    Console.WriteLine("Scrolling down");
                    continue;

                case "D": //DONE (exit out of this Do Loop)
                    break;

                case "Q": //QUIT (exit out to main menu)
                    return;

                default:
                    Console.WriteLine("Continuing");
                    continue;
            }

            break;

        } while (true);

        Console.WriteLine("Exited");
Run Code Online (Sandbox Code Playgroud)