如何打破内循环回到外循环?

时间:2010-12-22 14:34:30

标签: c# loops break nested-loops

我有4个实体“

ObjectA,ObjectB,ObjectC,ObjectD

foreach(ObjectA objectA in listObjectA)
if (relationAB)
  foreach(ObjectB objectB in listObjectB) 
  if (relationBC)   
    foreach(ObjectC objectC in listObjectC) 
    if (relationCD)   
      foreach(ObjectD objectD in listObjectD) 
        if (I found what I'm looking for)  
        Do something

所以,当我找到我要找的东西时,我想转到第一行,第一行,但是要从列表中找到第二行。我怎样才能做到这一点?惠特转到?

稍后编辑:这个问题适用于C#。

P.S。你能想出一个更好的办法来做我想做的事情,而不使用4个人吗?

4 个答案:

答案 0 :(得分:7)

好吧,因为这只是一个“编程语言”问题,所以一般的答案是使用你的语言设置来命名循环,然后在“break”语句中加上正确的名称。

可悲的是,我不认为当前版本的C和C ++支持这样的东西,所以在使用它们时你确实不得不诉诸goto。避免这种情况的一个好方法是将想要突破的循环放入其自己的子例程中,并在完成后只需return而不是break。这就是我在那些糟糕的语言中工作时通常所做的事情。

您的修改后的例子是:

void find_whatever (/* probably pass in the lists or objects to search for*/)
  foreach(ObjectA objectA in listObjectA)
    if (relationAB)
      foreach(ObjectB objectB in listObjectB) 
        if (relationBC)   
          foreach(ObjectC objectC in listObjectC) 
            if (relationCD)   
              foreach(ObjectD objectD in listObjectD) 
                if (I found what I'm looking for)  
                Do something
                return;

注意:标签已从“编程语言”更改为“C#”。对于这个问题,这是正确的做法,但是很多人都喜欢这个答案,所以我不会对它做出重大修改。

答案 1 :(得分:3)

根据语言的不同,您通常可以添加中断标签。但是,我会避免这种情况,并提出以下建议:

function main() {
    foreach (ObjectA a in listA) {
        if (relationAB) {
            processA(a)
        }
    }
}

function processA(ObjectA a) {
    foreach (b) {
        foreach (c) {
            foreach (d) {
                if (found) {
                    doSomething();
                    return;
                }
            }
        }
    }
}

可能很难读取具有中断标签和gotos的代码。将其分解为函数可以使其更容易阅读,并且(可能)更容易编写和调试。

答案 2 :(得分:1)

最简单的选择是将其全部放在函数中并使用return语句而不是break语句。

答案 3 :(得分:0)

在这种情况下最好使用return

只需将一些内部for放入方法中,并在必要时从中返回。

链接会比它更具可读性
if (found) {
 break;
}

在你的循环中。