Двойной foreach разрыв с оператором If?

Возможный дубликат:
Выход из вложенной петли

Я получил что-то вроде (для упрощения)

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

        if (statement)
        {
            break;
        }
    }
}

Дело в том, что я хочу, чтобы мое выступление ушло в цикл двойного foreach! Я думаю о некоем "флаге разрыва" как логическом, но есть ли способ избежать этого?

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;
}

Вы можете использовать goto.

Вы можете попробовать:

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

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

редактировать: перемещен флаг разрыва

Конечно, вы должны проверить Goto.

Imo один из немногих случаев, когда осторожный goto хорош.

Как break только разрывы из токовой петли, которые вы должны будете также проверить условие разрыва во внешней петле - если вы не используете goto заявление.

Переменная, казалось бы, лучший способ сделать это.

Вы можете заключить эту логику в метод и вернуться в точку останова:

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

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

очевидно, что вам может потребоваться немного изменить свой код, но это также имеет то преимущество, что, вероятно, делает код, где у вас есть двойной цикл, гораздо более читабельным.

Другие вопросы по тегам