2011-11-16 61 views
9

可能重複:
Breaking out of a nested loop雙foreach用「If」語句打破?

我得到了財產以後像(簡化)

foreach (...) 
{ 
    foreach (...) 
    { 
     //Some code 

     if (statement) 
     { 
      break; 
     } 
    } 
} 

的事情是,我希望我的發言要離開雙的foreach循環! 我正在考慮一種布爾型的「break flag」,但有什麼辦法可以避免這種情況?

+0

您可以通過使用'Linq'和避免它'SelectMany',使這個單一for-each循環,而不是一個嵌套循環。 –

+1

「破旗」或GOTO – relaxxx

+0

@Merlyn摩根 - 格雷厄姆:不知道這事,給看看吧! –

回答

7

你可以使用LINQ和SelectMany避免嵌套循環完全。

相反的:

foreach(var value in someValues) 
{ 
    foreach(var subValue in value.SubValues) 
    { 
     // ... 
     break; 
    } 
} 

您的代碼將變爲:

foreach(var subValue in someValues.SelectMany(v => v.SubValues)) 
{ 
    // ... 
    break; 
} 

如果你需要一些邏輯上SubValues選擇您是否循環,拋出邏輯附加Where條款。取而代之的

foreach(var value in someValues) 
{ 
    if(value.IsMumsHairGreenToday) 
    { 
     foreach(var subValue in value.SubValues) 
     { 
      // ... 
      break; 
     } 
    } 
} 

你可以寫:

var subValues = someValues 
    .Where(v => v.IsMumsHairGreenToday) 
    .SelectMany(v => v.SubValues) 
    ; 

foreach(var subValue in subValues) 
{ 
    // ... 
    break; 
} 
+0

我沒有與lambda表達式confortable所以沒有想到這樣做,聽起來不錯,因爲我避免了breakflag和使用GOTO! –

+3

@GuillaumeCogranne:除非您始終使用它們,否則您永遠都不會感到舒服。順便說一句:請不要使用'goto'。我不在乎人羣說什麼。這只是有罪的:) –

1

你可以封裝了邏輯的方法,並在破發點返回:

private SomeType CheckIfConditionOfNestedItems(IEnumerable enumerable) 
{ 
    foreach (var thing in enumerable) 
    { 
     foreach (...) 
     { 
      //Some code 

      if (statement) 
      { 
       return result; 
      } 
     } 
    } 
} 

顯然,這可能需要你改變你的代碼一點點,但是這也有個好處,它可能使代碼你有雙循環更可讀。

+0

不適合我的代碼-_- –

7

你可以嘗試:

bool leave = false; 
foreach (...) 
{ 
    foreach (...) 
    { 
     //Some code 

     if (statement) 
     { 
      leave = true; 
      break; 
     } 
    } 
    if (leave) break; 
} 

編輯:移動的破旗

+1

是的,這就是我所說的「breakflag」,但不喜歡它-_- –

+0

@GuillaumeCogranne:ops,我沒有讀到它... – Marco

10

您可以使用goto

+0

你在開玩笑嗎? – sll

+0

轉到FTW :) yay – jgauffin

+0

沒有使用休息時間標誌,goto幾乎是跳出多個嵌套循環的唯一選擇。 – Tudor

5

當然,你應該檢查goto

+0

任何downvoter請詳細說明你爲什麼這樣做? – DanielB

+1

誰和爲什麼downvote?僅僅因爲它的共同「邏輯」轉到了邪惡?沒有!不是!它仍然是語言的原因,有時候,雖然我很少見,但它是有用的。 – dowhilefor

+2

不同意-2這裏 - 他有一個有效的點:) –

2

由於break只有在當前循環中出現,所以您將不得不在外循環中測試中斷條件 - 除非使用goto語句。

的變量似乎這樣做的最佳方式。