【问题标题】:C# equivalent to Java's continue <label>?C# 等价于 Java 的 continue <label>?
【发布时间】:2008-12-11 14:01:54
【问题描述】:

应该简单快捷:我想要一个等效于以下Java代码的C#:

orig: for(String a : foo) {
  for (String b : bar) {
    if (b.equals("buzz")) {
      continue orig;
    }
  }
  // other code comes here...
}

编辑: 好吧,似乎没有这样的等价物(嘿 - Jon Skeet 自己说没有,这解决了它;))。所以我的“解决方案”(在它的 Java 中)是:

for(String a : foo) {
  bool foundBuzz = false;
  for (String b : bar) {
    if (b.equals("buzz")) {
      foundBuzz = true;
      break;
    }
  }
  if (foundBuzz) {
    continue;
  }
  // other code comes here...
}

【问题讨论】:

标签: c# java


【解决方案1】:

恐怕没有等价物。您必须使用布尔值,或者只是“转到”外部循环内部的末尾。它甚至比听起来更混乱,因为必须将标签应用于声明 - 但我们不想在这里做任何事情。但是,我认为这可以满足您的要求:

using System;

public class Test
{
    static void Main()
    {
        for (int i=0; i < 5; i++)
        {
            for (int j = 0; j < 5; j++)
            {
               Console.WriteLine("i={0} j={1}", i, j);
               if (j == i + 2)
               {
                   goto end_of_loop;   
               }
            }
            Console.WriteLine("After inner loop");
            end_of_loop: {}
        }
    }
}

我会强烈推荐一种不同的表达方式。我不能认为有很多时候没有更易读的编码方式。

【讨论】:

  • C# 有goto,但没有break/continue &lt;label&gt;,这有点令人惊讶。
  • C# 比 Java 更忠实于其 C 根源。它也有结构体和指针!
  • 等一下:@JonSkeet 是 AFRAID 的吗?在这种情况下,应该如何?
【解决方案2】:

其他可能性是用内循环制作一个函数:

void mainFunc(string[] foo, string[] bar)
{
  foreach (string a in foo)
    if (hasBuzz(bar))
      continue;
  // other code comes here...
}

bool hasBuzz(string[] bar)
{
  foreach (string b in bar)
    if (b.equals("buzz"))
      return true;
  return false;
}

【讨论】:

  • 我更喜欢这个,因为函数中的此类循环通常具有自己的良好语义(=> 好名称),因此可以重用。
【解决方案3】:

在 VB.Net 中,您可以只有一个 while 循环和一个 for 循环,然后 exit 所需的范围级别。

在 C# 中,可能是 break;

这可能会打破内部循环并允许外部循环继续进行。

【讨论】:

    【解决方案4】:

    我认为您正在寻找简单的“继续”关键字......但是,我不是 Java 人,我并没有真正理解代码 sn-p 试图实现的目标。

    但请考虑以下内容。

    foreach(int i in new int[] {1,2,3,5,6,7})
    {
        if(i % 2 == 0)
            continue;
        else
            Console.WriteLine(i.ToString());    
    }
    

    第 4 行的 continue 语句是在下一个值处继续循环的指令。这里的输出是 1,3,5 和 7。

    将“continue”换成“break”,如下,

    foreach(int i in new int[] {1,2,3,5,6,7})
    {
        if(i % 2 == 0)
           break;
        else
            Console.WriteLine(i.ToString());    
    }
    

    将给出输出 1。Break 指示循环终止,最常用于当您想要在满足条件时停止处理时。

    我希望这能给你一些你正在寻找的东西,但如果没有,请随时再次询问。

    【讨论】:

    • 谢谢,但我知道继续和中断之间的区别。 ;-) 事情是:我有两个嵌套循环。如果内部循环中的某个条件发生,我想“继续”外部循环。
    • 对不起 - 不是要教你吸鸡蛋 - 错在我没有充分阅读问题......
    【解决方案5】:

    你可以这样做:

    for(int i=0; i< foo.Length -1 ; i++) {
      for (int j=0; j< bar.Length -1; j++) {
        if (condition) {
          break;
        }
        if(j != bar.Length -1)
            continue;
        /*The rest of the code that will not run if the previous loop doesn't go all the way*/
      }
    }
    

    【讨论】:

    • 这里的问题是其余代码在嵌套循环之后,而不是在其中。
    • 哎呀,我刚刚注意到在我的第一个示例中,“//code here”注释的行错误。对不起。
    • 您可以在中断前设置一个标志,并在循环后检查标志。如果你真的希望你的代码正式“结构化”,你可以设置 j = bar.Length 而不是使用 'break'。
    • j = bar.Length 会将当前循环运行到最后,这不是预期的;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2013-05-26
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多