Как я могу продолжить Верхний цикл - PullRequest
2 голосов
/ 05 февраля 2012

У меня есть этот код:

foreach(int i in Directions)
        {
            if (IsDowner(i))
            {
                while (IsDowner(i))
                {
                    continue;
                    //if (i >= Directions.Count)
                    //{
                    //    break;
                    //}
                }

                //if (i >= Directions.Count)
                //{
                //    break;
                //}

                if (IsForward(i))
                {

                        continue;
                        //if (i >= Directions.Count)
                        //{
                        //    break;
                        //}

                    //check = true;
                }

                //if (i >= Directions.Count)
                //{
                //    break;
                //}

                if (IsUpper(i))
                {
                        //if (i >= Directions.Count)
                        //{
                        //    break;
                        //}
                    num++;
                    //check = false;
                }

                //if (check)
                //{
                //    num++;
                //}
            }
        }

, но я хочу иметь continue для foreach в while цикле.как я могу это сделать?

Ответы [ 4 ]

6 голосов
/ 05 февраля 2012

Вы не можете продолжить внешний цикл с внутреннего. У вас есть два варианта:

  1. Плохой: установите логический флаг перед разрывом внутреннего цикла, затем проверьте этот флаг и продолжайте, если он установлен.

  2. Хороший: просто реорганизуйте свой большой код спагетти в набор функций, чтобы у вас не было внутренних циклов.

6 голосов
/ 05 февраля 2012

Вы можете break выйти из цикла while и перейти к следующей итерации внешнего цикла foreach, которая запустит новый цикл while:

foreach(int i in Directions)
{
    while (IsDowner(i))
    {
        break;
    }
}

Если выпосле цикла while был какой-то другой код, который вы не хотите выполнять в этом случае, вы можете использовать логическую переменную, которая будет установлена ​​до выхода из цикла while, чтобы этот код не выполнялся иавтоматически перейти на следующую итерацию цикла forach:

foreach(int i in Directions)
{
    bool broken = false;
    while (IsDowner(i))
    {
        // if some condition =>
        broken = true;
        break;
    }

    if (broken) 
    {
        // we have broken out of the inner while loop
        // and we don't want to execute the code afterwards
        // so we are continuing on the next iteration of the
        // outer foreach loop
        continue;
    }

    // execute some other code
}
4 голосов
/ 05 февраля 2012

По моему мнению, использование goto оправдано в сложных вложенных циклах (стоит ли избегать использования сложных вложенных циклов - другой вопрос).

Вы можете сделать это:

foreach(int i in Directions)
{
    while (IsDowner(i))
    {
        goto continueMainLoop;
    }
    //There be code here
continueMainLoop:
}

Просто будьте осторожны, если другие люди должны иметь дело с кодом, убедитесь, что они не готофобны.

0 голосов
/ 23 сентября 2015

вы можете попробовать использовать предикаты для внутреннего цикла for, например:

    foreach (item it in firstList)
     {
        if (2ndList.Exists(x => it.Name.StartsWith(x))) //use predicate instead of for loop.
            {
                continue;
            } 
     }

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...