VB.NET - Wie gehe ich zum nächsten Element a für jede Schleife?


93

Gibt es eine Anweisung wie Exit For, außer dass die Schleife nicht verlassen wird, sondern nur zum nächsten Element verschoben wird .

Beispielsweise:

For Each I As Item In Items

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

    ' Do something

Next

Ich weiß, dass ich Elseder If-Anweisung einfach eine hinzufügen könnte, damit sie wie folgt lautet:

For Each I As Item In Items

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

Next

Ich frage mich nur, ob es eine Möglichkeit gibt, zum nächsten Element in der ItemsListe zu springen . Ich bin sicher, die meisten werden sich richtig fragen, warum sie nicht einfach die ElseAnweisung verwenden, aber für mich scheint das Umschließen des Codes "Do Something" weniger lesbar zu sein. Besonders wenn es viel mehr Code gibt.

Antworten:



48

Ich würde Continuestattdessen die Anweisung verwenden:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Beachten Sie, dass dies etwas anders ist als das Verschieben des Iterators selbst - alles, was vorher Ifausgeführt wird, wird erneut ausgeführt. Normalerweise ist dies das, was Sie wollen, aber wenn nicht, müssen Sie GetEnumerator()und dann MoveNext()/ Currentexplizit verwenden, anstatt eine For EachSchleife zu verwenden.


4

Wie wäre es mit:

If Not I = x Then

  ' Do something '

End If

' Move to next item '

1

Ich möchte klarstellen, dass der folgende Code keine gute Praxis ist. Sie können GOTO Label verwenden:

For Each I As Item In Items

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

    ' Do something
    Label1:
Next

23
Sie könnten, aber bitte nicht.
MiseryIndex

Aufgrund des Sprungs ist es daher schlecht.
Syed Tayyab Ali

4
Wenn es sich nicht um eine bewährte Methode handelt und es eine deutlich bessere Lösung gibt, die von der Sprache unterstützt wird (Weiter für / Weiter als nächstes), sollte diese Antwort möglicherweise freiwillig entfernt werden.
EniacAvenger

Stackoverflow ermöglicht mehrere Antworten, um die verfügbaren Optionen zu erkunden. Ich bin damit einverstanden, dass dies eine schlechte Option ist, aber es ist eine Option. Ich denke, es lohnt sich, der Vollständigkeit halber aufgenommen zu werden.
Jeff

0

Als ich es ausprobiert Continue Forhabe, ist ein Compilerfehler aufgetreten. Dabei habe ich 'Resume' entdeckt:

For Each I As Item In Items

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

    'Do something

Next

Hinweis: Ich verwende hier VBA.


2
Dieser Code funktioniert nicht einmal in VBA. Resume Nextist für die unstrukturierte Fehlerbehandlung.
Daniel

Sie müssen eine große IF-Anweisung verwenden, um das gesamte Ende der Schleife in VBA zu verpacken, da es keine continue-Anweisung gibt. AlsoIf I <> x Then
HackSlash

0

Nur "Weiter für" ist ein akzeptabler Standard (der Rest führt zu "Spaghetti-Code").

Zumindest mit "continue for" weiß der Programmierer, dass der Code direkt an den Anfang der Schleife geht.

Für Puristen ist so etwas jedoch am besten, da es sich um reinen "Nicht-Spaghetti" -Code handelt.

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

Zur Vereinfachung der Codierung ist "Weiter für" in Ordnung. (Gute Idee, es zu kommentieren).

Verwenden von "Weiter für"

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.