1

我有 4 个实体”

对象A、对象B、对象C、对象D

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# 的。

PS你能想出一个更好的方法来做我想做的事,而不使用4个fors吗?

4

4 回答 4

7

好吧,由于这只是一个“编程语言”问题,一般的答案是使用您的语言的工具来命名循环,然后将正确的名称放在“break”语句上。

可悲的是,我认为当前版本的 C 和 C++ 不支持这样的东西,所以你goto在使用它们时确实不得不求助于 a。避免这种情况的一个好方法是将要中断的循环放入它自己的子例程中,并在完成return时执行 a 而不是 a 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#”。对于这个问题,这是正确的做法,但是很多人都喜欢这个答案,所以我不会对其进行重大修改。

于 2010-12-22T14:38:58.190 回答
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;
                }
            }
        }
    }
}

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

于 2010-12-22T14:39:03.590 回答
1

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

于 2010-12-22T14:40:38.990 回答
0

最好return在这种情况下使用。

只需将你的一些内在for放入一个方法中,并在必要时从它返回。它将比一连串更具可读性

if (found) {
 break;
}

在你的循环里面。

于 2010-12-22T14:41:15.140 回答