Двойной 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;
}
Вы можете попробовать:
bool leave = false;
foreach (...)
{
foreach (...)
{
//Some code
if (statement)
{
leave = true;
break;
}
}
if (leave) break;
}
редактировать: перемещен флаг разрыва
Как break
только разрывы из токовой петли, которые вы должны будете также проверить условие разрыва во внешней петле - если вы не используете goto
заявление.
Переменная, казалось бы, лучший способ сделать это.
Вы можете заключить эту логику в метод и вернуться в точку останова:
private SomeType CheckIfConditionOfNestedItems(IEnumerable enumerable)
{
foreach (var thing in enumerable )
{
foreach (...)
{
//Some code
if (statement)
{
return result;
}
}
}
}
очевидно, что вам может потребоваться немного изменить свой код, но это также имеет то преимущество, что, вероятно, делает код, где у вас есть двойной цикл, гораздо более читабельным.