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


93

Чи існує такий вираз 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
Я ледь не отримав Skeeted ще раз! ;)
Адам Робінсон

Краще закрийте Ifвиписку належним чином. Це оманливе.
mchar

48

ContinueЗамість цього я б використав твердження:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Зауважте, що це дещо відрізняється від переміщення самого ітератора - все, що Ifбуде до, буде виконано знову. Зазвичай це те, що ви хочете, але якщо ні, вам доведеться використовувати, GetEnumerator()а потім MoveNext()/ Currentявно, а не використовувати For Eachцикл.


4

А як на рахунок:

If Not I = x Then

  ' Do something '

End If

' Move to next item '

1

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

For Each I As Item In Items

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

    ' Do something
    Label1:
Next

23
Ви могли б, але, будь ласка, ні.
MiseryIndex

Через стрибок, тому це погано.
Сайед Тайяб Алі,

4
Якщо це не є доброю практикою, і є чітко краще рішення, яке підтримує мова (Продовжити на / Відновити далі), можливо, цю відповідь слід добровільно видалити.
eniacAvenger

Stackoverflow надає кілька відповідей з метою вивчення діапазону доступних варіантів. Я згоден, що це поганий варіант, але це варіант. Тож я думаю, що це варто включити для повноти.
Джефф,

0

Коли я спробував Continue Forце не вдалося, я отримав помилку компілятора. Роблячи це, я виявив "Резюме":

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призначений для неструктурованої обробки помилок.
Даніель

Вам потрібно використовувати великий оператор IF, щоб обернути весь кінець циклу у VBA, оскільки оператора continue немає. ОтжеIf I <> x Then
HackSlash

0

Лише "Продовжити до" є прийнятним стандартом (інше веде до "коду спагетті").

Принаймні з "продовжити для" програміст знає, що код переходить безпосередньо до початку циклу.

Однак для пуристів щось подібне найкраще, оскільки це чистий "неспагетті" код.

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.