2011-11-16 62 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语句。

的变量似乎这样做的最佳方式。