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цикла.



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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.