我有麻烦搞清楚如何突破包含switch语句中循环了。 break中断开关,而不是循环的。

有可能是一个更好的解决方案于此。我已实施启动了作为真正的和被设置为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);

下面是执行此在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

谢谢,

有帮助吗?

解决方案

我发现这种形式是有史以来所以,稍微更可读的:

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; 
    } 
}

其他提示

我会尽量避免它,但你可以使用...

转到

然而,愤怒的暴徒拿着叉子变,如果你选择这样做的职业病。

这里的一种选择是该循环重构为一个方法(“提取方法”),以及使用return

我知道的唯一的其他方式是可怕的goto。 MSDN还表示此。

不过,我看不出为什么你会使用它在这种情况下。您已经实现的方式工作得很好,并且比转到更易于维护。我会珍惜你拥有的东西。

您必须使用多层次休息goto语句。这似乎是在C#中唯一的“干净”的方式。使用标志也是有用的,但需要额外的代码,如果回路具有其他困境运行。

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

这可能是有趣的是,一些其他非C语言做break levels;具有多层次符(Java是一样没用,不过,因为它使用了伪装成一个继续转到..:P)

为什么开关未包装到一个方法,该方法返回一个布尔保持对循环?它必须使代码更易读的附带好处。还有一个原因,有人写了一篇论文说,我们不需要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;
}

一个标志是做到这一点的标准方式。我所知道的唯一的另一种方法是使用goto

您不能轻易摆脱外环的,但你可以continue它。

如果你扭转你的逻辑,那么你得到这个。 注有switch语句之后立即break退出循环。

这是不是在我看来很可读的代码,我认为一个标志仍然是最好的。

   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");

您可以用switch语句替换if/else声明。没有goto需要和break声明叶子循环:

do
{
  String c = MLTWatcherTCPIP.Get().ToUpper();

  if (c = "")
    MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown();
  else if (c = "P")
    MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextUp();
  else if (c = "D")
     break;
  else if (c = "Q")
    return;
  else
  {
    // Handle bad input here.
  }
} while (keepLooping)

把它包装成一个功能,使用return语句退出。怎么样?

IMO,这似乎是一个while环的爆发的完全正常的方式。它做你期望有没有副作用的。我能想到做的

if(!keepOnLooping)
  break;

但是,这并不是真的在执行方面有什么不同。

写入是这样的:

case "Exit/Break" :
                  //Task to do
                    if(true)
                      break;

此断裂将不会与任何情况下相关联。它将属于while循环。

您可以在switch语句更改为为/ foreach循环。一旦条件满足集“keepOnLooping”为false,然后利用突破得到循环出来。其余部分应该照顾自己。

另一个(没有那么大)的替代方法是唯一地处理,你必须具有一个case“环路的爆发”直线距离并将其移出该if块的switch。如果开关情况下的很长不是非常优雅:

do
{
    var expression = MLTWatcherTCPIP.Get().ToUpper();
    if (expression = "D") //DONE (exit out of this Do Loop)
    {   
        statement;
        break;
    }

    switch (expression)
    {
        case "": //scroll/display next inventory location
            MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown();
            break;
        case "P": //scroll/display previous inventory location
            MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown();
            break;
        case "Q": //QUIT (exit out to main menu)
            return;
        default:
            break;
    }
} while (true); //or whatever your condition is

您还可以使case本身while循环的条件的一部分,考虑到你只有打破循环,并表达自己的计算出是微不足道的(就像读一变量)。

do
{
    switch (expression)
    {
        case "": //scroll/display next inventory location
            MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown();
            break;
        case "P": //scroll/display previous inventory location
            MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown();
            break;
        case "Q": //QUIT (exit out to main menu)
            return;
        default:
            break;
    }
} while (condition && expression != "D");

此外,如果重构整个事情到一个新的方法(这是最好的解决方法,以这一点)是出于某种原因不能接受的,那么还可以依赖于一个匿名委托做同样的现有的方法中。

可能会或可能不会工作,但LAMDA为什么不给它一个镜头只是为了好玩。

while(  (expr) => (){
switch(expr){
case 1: dosomething; return true; 
case 2 : something;return true;
case exitloop:return false;}
});   
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top