双重foreach打破"If"声明?

Gui*_*shy 9 c# foreach

可能重复:
突破嵌套循环

我得到的东西(简化)

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

        if (statement)
        {
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我希望我的声明留给双foreach循环!我正在考虑将某种"破坏标志"作为布尔值,但是有什么方法可以避免这种情况吗?

ada*_*ost 10

你可以使用转到.

  • 有趣的是 - 只是提到`goto`导致立即自动downvotes;)然而奇怪的是它可能听起来,但退出外循环使用`goto`比没有它更干净,所以这是使用它的一个场景确实是合理的.+1 (7认同)
  • @Andras Zoltan:因为我们都是在没有任何具体知识的情况下出生的,所以我们从像大学发展这样的地方学习它,所以这是原创的来源,知识可以进入我们的思想,建立/形成我们的愿景.所以这是我自己对这个案子的看法.即便如此,我只是建议不要使用它,但要理解另一个人的观点,所以即使我不喜欢它,我也不会低估这些答案,因为它解决了问题所代表的问题 (3认同)
  • 我不喜欢'int'用于所有'双'而是;) (2认同)

Mar*_*rco 7

你可以尝试:

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

        if (statement)
        {
            leave = true;
            break;
        }
    }
    if (leave) break;
}
Run Code Online (Sandbox Code Playgroud)

编辑:移动了break标志


Mer*_*ham 7

您可以通过使用Linq和完全避免嵌套循环SelectMany.

代替:

foreach(var value in someValues)
{
    foreach(var subValue in value.SubValues)
    {
        // ...
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

您的代码将变为:

foreach(var subValue in someValues.SelectMany(v => v.SubValues))
{
    // ...
    break;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要一些逻辑来选择是否循环SubValues,请将该逻辑抛出到附加Where子句中.

代替

foreach(var value in someValues)
{
    if(value.IsMumsHairGreenToday)
    {
        foreach(var subValue in value.SubValues)
        {
            // ...
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以写:

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

foreach(var subValue in subValues)
{
    // ...
    break;
}
Run Code Online (Sandbox Code Playgroud)

  • @GuillaumeCogranne:在你一直使用它们之前,你永远不会感到舒服.顺便说一句:请不要使用`goto`.我不在乎人群说什么.这只是有罪的:) (3认同)

Dan*_*elB 5

当然,你应该检查转到.

  • 不同意-2在这里 - 他有一个有效的点:) (2认同)