Ответ 1
Единственный путь к этому напрямую - с goto
.
Другой (лучший) вариант заключается в реструктуризации, пока проблема не исчезнет. Например, поместив внутренний код (while + foreach) в метод и используйте return для возврата.
У меня есть следующий код:
foreach(// Some condition here)
{
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
}
}
}
}
Что я хочу сделать, так это когда я попал в 2-й оператор if
в последнем цикле foreach
, чтобы вернуться в первый цикл foreach
.
Примечание. Если 2-й оператор if
неверен, он должен продолжить последний цикл foreach
, пока условие не будет истинным.
Спасибо заранее!
Единственный путь к этому напрямую - с goto
.
Другой (лучший) вариант заключается в реструктуризации, пока проблема не исчезнет. Например, поместив внутренний код (while + foreach) в метод и используйте return для возврата.
Что-то вроде этого:
resetLoop = false;
for(// Some condition here)
{
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
resetLoop = true;
break;
}
}
if (resetLoop) break;
}
if (resetLoop) {
// Reset for loop to beginning
// For example i = 0;
}
}
Никто не упомянул об этом (Хенк упомянул кратко), но наилучшим подходом было бы перевести ваши циклы в собственный метод и использовать return
public ReturnType Loop(args)
{
foreach outerloop
foreach innerLoop
if(Condition)
return;
}
Как говорилось выше, я также рекомендую перефакторировать код и посмотреть, необходимо ли иметь 3 петли, вложенных друг в друга. Если это так, и я предполагаю, что существует некоторая логика, вы должны рассмотреть возможность разделения на подфункции (как предложено)
Для простого решения кода:
foreach(// Some condition here)
{
var broke = false;
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
broke = true;
break;
}
}
if (broke) break;
// continue your while loop
}
}
Как я вижу, вы приняли ответ, в котором человек ссылается на ваше утверждение goto, где в современном программировании и в экспертном заключении goto является убийцей, мы назвали его убийцей в программировании, который имеет некоторые определенные причины, которые я не буду обсуждать это здесь, но решение вашего вопроса очень просто, вы можете использовать булевский флаг в таком сценарии, как я продемонстрирую его в своем примере:
foreach(// Some condition here)
{
//solution
bool breakme = false;
while (// Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
breakme = true;
break;
}
}
}
if(breakme)
{
break;
}
}
простой и простой.:)
var broken = false;
foreach(// Some condition here)
{
broken = false;
while (!broken && // Some condition here)
{
foreach (// Some condition here)
{
if (// Condition again)
{
//Do some code
}
if (// Condition again)
{
//Stop the first foreach then go back to first foreach
broken = true;
break;
}
}
}
}