VB.NET - Jak przejść do następnej pozycji a For Each Loop?

94

Czy istnieje taka instrukcja Exit For, z wyjątkiem tego, że zamiast wyjść z pętli, po prostu przechodzi do następnej pozycji.

Na przykład:

For Each I As Item In Items

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

    ' Do something

Next

Wiem, że mógłbym po prostu dodać Elsedo instrukcji If, aby brzmiało następująco:

For Each I As Item In Items

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

Next

Zastanawiam się tylko, czy istnieje sposób, aby przejść do następnej pozycji na Itemsliście. Jestem pewien, że większość z nich właściwie zapyta, dlaczego po prostu nie użyć Elseinstrukcji, ale dla mnie zawijanie kodu „Zrób coś” wydaje się być mniej czytelne. Zwłaszcza gdy kodu jest dużo więcej.

Sean Taylor
źródło

Odpowiedzi:

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

    ' Do something
Next
Adam Robinson
źródło
Dzięki temu właśnie tego szukałem, zabawne, że nie ma go w dokumentacji MSDN? ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) Gratuluję również pokonania Jona w słupek o całe 20 sekund! :)
Sean Taylor
9
Po raz kolejny prawie dostałem Skeeted! ;)
Adam Robinson
Lepiej zamknij Ifpoprawnie oświadczenie. To jest mylące.
mchar
48

Chciałbym użyć Continueoświadczenie zamiast:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Zauważ, że różni się to nieco od przeniesienia samego iteratora - wszystko przed wykonaniem Ifzostanie ponownie wykonane. Zwykle tego chcesz, ale jeśli nie, będziesz musiał użyć, GetEnumerator()a następnie MoveNext()/ Currentjawnie zamiast używać For Eachpętli.

Jon Skeet
źródło
4

Co powiesz na:

If Not I = x Then

  ' Do something '

End If

' Move to next item '
timo2oo8
źródło
1

Chcę jasno powiedzieć, że poniższy kod nie jest dobrą praktyką. Możesz użyć 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
Syed Tayyab Ali
źródło
24
Mógłbyś, ale nie rób tego.
MiseryIndex
Z powodu skoku jest więc zły.
Syed Tayyab Ali
4
Jeśli nie jest to dobra praktyka i istnieje wyraźnie lepsze rozwiązanie, które obsługuje język (Kontynuuj dla / Wznów dalej), być może ta odpowiedź powinna zostać dobrowolnie usunięta.
eniacAvenger
Stackoverflow umożliwia udzielanie wielu odpowiedzi w celu zbadania zakresu dostępnych opcji. Zgadzam się, że to zła opcja, ale jest to opcja. Dlatego uważam, że jest to warte uwzględnienia ze względu na kompletność.
Jeff
0

Kiedy próbowałem Continue Forto nie powiodło się, wystąpił błąd kompilatora. Robiąc to, odkryłem „Wznów”:

For Each I As Item In Items

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

    'Do something

Next

Uwaga: używam tutaj VBA.

Karmendra
źródło
2
Ten kod nie działa nawet w VBA. Resume Nextsłuży do obsługi błędów nieustrukturyzowanych.
Daniel
Musisz użyć dużej instrukcji IF, aby zawinąć cały koniec pętli w języku VBA, ponieważ nie ma instrukcji continue. A więcIf I <> x Then
HackSlash
0

Jedynie „Kontynuuj dla” jest akceptowalnym standardem (reszta prowadzi do „kodu spaghetti”).

Przynajmniej przy „kontynuuj dla” programista wie, że kod przechodzi bezpośrednio na początek pętli.

Jednak dla purystów coś takiego jest najlepsze, ponieważ jest to czysty kod „nie spaghetti”.

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

Jednak dla ułatwienia kodowania „Kontynuuj dla” jest OK. (Ale dobry pomysł, żeby to skomentować).

Korzystanie z opcji „Kontynuuj dla”

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
Chris Raisin
źródło