2010-12-22 73 views
1

我有4個實體」如何擺脫內循環回到外循環?

對象A,對象B,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#

PS你能想到更好的辦法做我正在努力。要做,沒有使用4 fors?

+0

這是語言相關的。 – 2010-12-22 14:35:21

+0

在PS上,這些列表是以某種方式相關的,需要這種四重嵌入?在你的玩具例子中,我不明白他們爲什麼不能進行4次單獨的搜索。 – 2010-12-22 15:15:12

回答

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#」 改變。對於這個問題,這是正確的做法,但很多人都喜歡這個答案,所以我沒有對它進行主要的修改。

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的代碼。將其分解爲函數可以使其更容易閱讀和(可能)更易於編寫和調試。

1

最簡單的方法是將它全部放入函數中,並使用return而不是break語句。

0

在這種情況下更好使用return

只需在方法中放入一些內部for,並在必要時從中返回。它將會更加可讀,然後在你的循環內部的一個鏈條上可讀

if (found) { 
break; 
}