VB.NET - Comment passer à l'élément suivant a For Each Loop?

93

Y a-t-il une déclaration comme Exit For, sauf qu'au lieu de quitter la boucle, elle passe simplement à l'élément suivant.

Par exemple:

For Each I As Item In Items

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

    ' Do something

Next

Je sais que je pourrais simplement ajouter un Elseà l'instruction If pour qu'il se lise comme suit:

For Each I As Item In Items

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

Next

Je me demande simplement s'il existe un moyen de passer à l'élément suivant de la Itemsliste. Je suis sûr que la plupart se demanderont correctement pourquoi ne pas simplement utiliser l' Elseinstruction, mais pour moi, l'encapsulation du code "Do Something" semble être moins lisible. Surtout quand il y a beaucoup plus de code.

Sean Taylor
la source

Réponses:

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

    ' Do something
Next
Adam Robinson
la source
Merci c'est exactement ce que je cherchais, drôle comment ce n'est pas dans la documentation MSDN ?? ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) Félicitations également pour avoir battu Jon au poste, de 20 secondes! :)
Sean Taylor
9
J'ai failli être à nouveau Skeeted! ;)
Adam Robinson
Vous feriez mieux de fermer Ifcorrectement la déclaration. C'est trompeur.
mchar
48

J'utiliserais Continueplutôt la déclaration:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Notez que cela est légèrement différent du déplacement de l'itérateur lui-même - tout ce qui se trouve avant le Ifsera à nouveau exécuté. C'est généralement ce que vous voulez, mais sinon vous devrez utiliser GetEnumerator()et ensuite MoveNext()/ Currentexplicitement plutôt que d'utiliser une For Eachboucle.

Jon Skeet
la source
4

Qu'en est-il de:

If Not I = x Then

  ' Do something '

End If

' Move to next item '
timo2oo8
la source
1

Je tiens à préciser que le code suivant n'est pas une bonne pratique. Vous pouvez utiliser 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
la source
23
Vous pourriez, mais ne le faites pas.
MiseryIndex
En raison du saut, c'est donc mauvais.
Syed Tayyab Ali
4
Si ce n'est pas une bonne pratique et qu'il existe une solution clairement meilleure que le langage prend en charge (Continuer pour / Reprendre ensuite), peut-être que cette réponse devrait être volontairement supprimée.
eniacAvenger
Stackoverflow permet plusieurs réponses dans le but d'explorer la gamme d'options disponibles. Je suis d'accord que c'est une mauvaise option, mais c'est une option. Je pense donc que cela vaut la peine d'être inclus pour être complet.
Jeff
0

Quand j'ai essayé Continue For, j'ai échoué, j'ai eu une erreur de compilation. En faisant cela, j'ai découvert 'Resume':

For Each I As Item In Items

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

    'Do something

Next

Remarque: j'utilise VBA ici.

Karmendra
la source
2
Ce code ne fonctionne même pas en VBA. Resume Nextest pour la gestion des erreurs non structurées.
Daniel
Vous devez utiliser une grosse instruction IF pour encapsuler toute la fin de la boucle dans VBA car il n'y a pas d'instruction continue. SoIf I <> x Then
HackSlash
0

Seul le "Continue For" est une norme acceptable (le reste conduit au "code spaghetti").

Au moins avec «continuer pour», le programmeur sait que le code va directement en haut de la boucle.

Pour les puristes cependant, quelque chose comme ça est le meilleur car c'est du code pur "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

Pour faciliter le codage cependant, "Continuer pour" est OK. (Bonne idée de le commenter cependant).

Utilisation de "Continuer pour"

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
la source