Продолжайте в то время как внутри foreach - PullRequest
2 голосов
/ 07 марта 2009

В следующем фрагменте кода C #
У меня есть цикл 'while' внутри цикла 'foreach', и я хочу перейти к следующему элементу в 'foreach', когда возникает определенное условие.

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        this.ExecuteSomeMoreCode();
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
        }
        this.ExecuteEvenMoreCode();
        this.boolValue = this.ResumeWhileLoop();
    }
    this.ExecuteSomeOtherCode();
}

'continue' будет переходить к началу цикла 'while', а не к циклу 'foreach'. Есть ли здесь ключевое слово для использования, или я должен просто использовать goto, который мне не очень нравится.

Ответы [ 5 ]

9 голосов
/ 07 марта 2009

Используйте ключевое слово break. Это выйдет из цикла while и продолжит выполнение вне его. Поскольку у вас ничего не будет через некоторое время, он будет переходить к следующему элементу в цикле foreach.

На самом деле, если присмотреться к вашему примеру более внимательно, вы действительно хотите иметь возможность продвигать цикл for, не выходя из этого времени. Вы не можете сделать это с циклом foreach, но вы можете разбить цикл foreach на то, что он на самом деле автоматизирует. В .NET цикл foreach фактически отображается как вызов .GetEnumerator () для объекта IEnumerable (которым является ваш объект this.ObjectNames).

Цикл foreach в основном такой:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    string objectName = (string)enumerator.Value;

    // your code inside the foreach loop would be here
}

Если у вас есть эта структура, вы можете вызвать enumerator.MoveNext () внутри цикла while, чтобы перейти к следующему элементу. Таким образом, ваш код станет:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    while (this.ResumeWhileLoop())
    {
        if (this.MoveToNextObject())
        {
            // advance the loop
            if (!enumerator.MoveNext())
                // if false, there are no more items, so exit
                return;
        }

        // do your stuff
    }
}
3 голосов
/ 07 марта 2009

Следующее должно сделать трюк

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
            break;
        }
    }
    if (! this.boolValue) continue; // continue foreach

    this.ExecuteSomeOtherCode();
}
2 голосов
/ 07 марта 2009

Ключевое слово break; выйдет из цикла:

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        if (this.MoveToNextObject())
        {
            break;
        }
        this.boolValue = this.ResumeWhileLoop();
    }
}
1 голос
/ 07 марта 2009

Использование goto.

(Я думаю, что люди будут злиться на этот ответ, но я определенно думаю, что он более читабелен, чем все другие варианты.)

0 голосов
/ 07 марта 2009

Вы можете использовать «перерыв»; выйти из самого внутреннего времени или foreach.

...