双重foreach打破“If”声明?

时间:2011-11-16 11:00:33

标签: c# foreach

  

可能重复:
  Breaking out of a nested loop

我有点像(简化)

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

        if (statement)
        {
            break;
        }
    }
}

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

7 个答案:

答案 0 :(得分:10)

您可以使用goto

答案 1 :(得分:7)

你可以尝试:

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

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

编辑:移动了休息标志

答案 2 :(得分: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;
}

答案 3 :(得分:5)

当然,您应该查看goto

答案 4 :(得分:2)

由于break只会突破当前循环,因此您必须在外循环中测试中断条件 - 除非您使用goto语句。

变量似乎是最好的方法。

答案 5 :(得分:2)

Imo少数情况之一,小心goto很好。

答案 6 :(得分:1)

您可以将该逻辑封装在方法中并在断点处返回:

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

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

显然这可能需要你稍微更改一下你的代码,但这也有一个好处,就是它可能会让你拥有双循环的代码更具可读性。