VB.NET - Come passare all'elemento successivo a For Each Loop?


93

C'è un'istruzione simile Exit For, tranne che invece di uscire dal ciclo si sposta semplicemente all'elemento successivo.

Per esempio:

For Each I As Item In Items

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

    ' Do something

Next

So che potrei semplicemente aggiungere un Elseall'istruzione If in modo che si legga come segue:

For Each I As Item In Items

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

Next

Mi chiedevo solo se c'è un modo per passare all'elemento successivo Itemsnell'elenco. Sono sicuro che la maggior parte si chiederà correttamente perché non usi solo l' Elseistruzione, ma a me sembra che il wrapping del codice "Do Something" sia meno leggibile. Soprattutto quando c'è molto più codice.

Risposte:


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

    ' Do something
Next

Grazie, questo è esattamente quello che stavo cercando, divertente come non è nella documentazione di MSDN ?? ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) Congratulazioni anche per aver battuto Jon sul post, di ben 20 secondi! :)
Sean Taylor,

9
Ho quasi ottenuto di nuovo Skeet! ;)
Adam Robinson,

Faresti meglio a chiudere Ifcorrettamente la dichiarazione. È fuorviante.
mchar

48

Userei Continueinvece la dichiarazione:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Nota che questo è leggermente diverso dallo spostare l'iteratore stesso su: qualsiasi cosa prima di Ifverrà eseguita di nuovo. Di solito questo è quello che vuoi, ma in caso contrario dovrai usare GetEnumerator()e quindi MoveNext()/ Currentesplicitamente piuttosto che usare un For Eachciclo.


4

Che dire:

If Not I = x Then

  ' Do something '

End If

' Move to next item '

1

Voglio essere chiaro che il codice seguente non è una buona pratica. Puoi usare 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

23
Potresti, ma per favore non farlo.
MiseryIndex

A causa del salto, quindi è male.
Syed Tayyab Ali,

4
Se non è una buona pratica, e c'è una soluzione chiaramente migliore supportata dalla lingua (Continua per / Riprendi dopo), forse questa risposta dovrebbe essere rimossa volontariamente.
eniacAvenger

Stackoverflow consente più risposte allo scopo di esplorare la gamma di opzioni disponibili. Sono d'accordo che questa sia una cattiva opzione, ma è un'opzione. Quindi penso che sia degno di essere incluso per completezza.
Jeff

0

Quando l'ho provato Continue Fornon è riuscito, ho ricevuto un errore del compilatore. Mentre lo facevo, ho scoperto 'Resume':

For Each I As Item In Items

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

    'Do something

Next

Nota: sto usando VBA qui.


2
Questo codice non funziona nemmeno in VBA. Resume Nextè per la gestione degli errori non strutturati.
Daniel

È necessario utilizzare una grande istruzione IF per avvolgere l'intera fine del ciclo in VBA perché non è presente alcuna istruzione continue. QuindiIf I <> x Then
HackSlash

0

Solo il "Continua per" è uno standard accettabile (il resto porta a "codice spaghetti").

Almeno con "continua per" il programmatore sa che il codice va direttamente all'inizio del ciclo.

Per i puristi, però, qualcosa di simile è il migliore poiché è puro codice "non 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

Tuttavia, per facilità di codifica, "Continua per" è OK. (Buona idea commentarla però).

Utilizzo di "Continua per"

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.