Подтвердить что ты не робот

Как разбить вложенный цикл foreach, перейдите в родительский цикл foreach на С#

У меня есть следующий код:

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, пока условие не будет истинным.

Спасибо заранее!

4b9b3361

Ответ 1

Единственный путь к этому напрямую - с goto.

Другой (лучший) вариант заключается в реструктуризации, пока проблема не исчезнет. Например, поместив внутренний код (while + foreach) в метод и используйте return для возврата.

Ответ 2

Что-то вроде этого:

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

Ответ 3

Никто не упомянул об этом (Хенк упомянул кратко), но наилучшим подходом было бы перевести ваши циклы в собственный метод и использовать return

public ReturnType Loop(args)
{
foreach outerloop
    foreach innerLoop
       if(Condition)
          return;
}

Ответ 4

Как говорилось выше, я также рекомендую перефакторировать код и посмотреть, необходимо ли иметь 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
    }
}

Ответ 5

Как я вижу, вы приняли ответ, в котором человек ссылается на ваше утверждение 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;
    }
}

простой и простой.:)

Ответ 6

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