VB.NET - Как перейти к следующему элементу для каждого цикла?

94

Есть ли такой статус Exit For, за исключением того, что вместо выхода из цикла он просто переходит к следующему элементу.

Например:

For Each I As Item In Items

    If I = x Then 
        ' Move to next item
    End If

    ' Do something

Next

Я знаю, что можно просто добавить оператор ElseIf, чтобы он читался следующим образом:

For Each I As Item In Items

    If I = x Then 
        ' Move to next item
    Else
        ' Do something
    End If

Next

Просто интересно, есть ли способ перейти к следующему элементу в Itemsсписке. Я уверен, что большинство правильно спросит, почему бы просто не использовать этот Elseоператор, но мне кажется, что упаковка кода «Сделай что-нибудь» менее читабельна. Особенно, когда кода намного больше.

Шон Тейлор
источник

Ответы:

178
For Each I As Item In Items
    If I = x Then Continue For

    ' Do something
Next
Адам Робинсон
источник
Спасибо, это именно то, что я искал, забавно, как это не в документации MSDN ?? ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) Также поздравляю с тем, что Джона опередили на целых 20 секунд! :)
Шон Тейлор
9
Я чуть не получил Скитед еще раз! ;)
Адам Робинсон
Вам лучше закрыть Ifзаявление как следует. Это заблуждение.
mchar
48

ContinueВместо этого я бы использовал инструкцию:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Обратите внимание, что это немного отличается от перемещения самого итератора - все, что до того, как Ifбудет выполнено снова. Обычно это то, что вы хотите, но если нет, вам придется использовать GetEnumerator()and then MoveNext()/ Currentявно вместо использования For Eachцикла.

Джон Скит
источник
4

Что о:

If Not I = x Then

  ' Do something '

End If

' Move to next item '
timo2oo8
источник
1

Я хочу прояснить, что следующий код не является хорошей практикой. Вы можете использовать GOTO Label:

For Each I As Item In Items

    If I = x Then
       'Move to next item
        GOTO Label1
    End If

    ' Do something
    Label1:
Next
Сайед Тайяб Али
источник
24
Вы могли бы, но, пожалуйста, не надо.
MiseryIndex,
Из-за прыжка, поэтому это плохо.
Сайед Тайяб Али
4
Если это не очень хорошая практика и существует явно лучшее решение, которое поддерживает язык (Продолжить / Продолжить далее), возможно, этот ответ следует удалить добровольно.
eniacAvenger
Stackoverflow допускает несколько ответов с целью изучения диапазона доступных вариантов. Я согласен, что это плохой вариант, но это вариант. Так что я считаю, что его стоит включить для полноты картины.
Джефф
0

Когда я попробовал Continue Forэто Failed, я получил ошибку компилятора. При этом я обнаружил «Резюме»:

For Each I As Item In Items

    If I = x Then
       'Move to next item
       Resume Next
    End If

    'Do something

Next

Примечание: здесь я использую VBA.

Кармендра
источник
2
Этот код даже не работает в VBA. Resume Nextпредназначен для неструктурированной обработки ошибок.
Daniel
Вы должны использовать большой оператор IF, чтобы обернуть весь конец цикла в VBA, потому что нет оператора continue. ИтакIf I <> x Then
HackSlash
0

Только «Продолжить для» является приемлемым стандартом (остальное приводит к «спагетти-коду»).

По крайней мере, с «continue for» программист знает, что код переходит непосредственно в начало цикла.

Однако для пуристов лучше всего будет что-то подобное, поскольку это чистый "не спагетти-код".

Dim bKeepGoing as Boolean 
For Each I As Item In Items
  bKeepGoing = True
  If I = x Then
    bKeepGoing = False
  End If
  if bKeepGoing then
    ' Do something
  endif
Next

Однако для простоты кодирования "Продолжить для" в порядке. (Хотя неплохо было бы это прокомментировать).

Использование "Продолжить для"

For Each I As Item In Items
  If I = x Then
    Continue For   'skip back directly to top of loop
  End If
  ' Do something
Next
Крис Рэйзин
источник