"Continue" (à la prochaine itération) sur VBScript

un collègue et moi essayions de trouver un moyen de faire l'équivalent d'une déclaration "continue" dans une boucle "For/Next" de VBScript.

partout où nous avons regardé, nous avons trouvé que les gens n'avaient aucun moyen de faire cela dans VBScript sans avoir des nichages désagréables, ce qui n'est pas une option pour nous car c'est une assez grande boucle.

Nous sommes arrivés avec cette idée. Serait-il aussi un "continuer(à la prochaine itération)"? Quelqu'un a une meilleure solution ou d'amélioration suggestion?

For i=1 to N
  For workaroundloop = 1 to 1
    [Code]
    If Condition1 Then
      Exit For
    End If

    [MoreCode]
    If Condition2 Then
      Exit For
    End If

    [MoreCode]
    If Condition2 Then
      Exit For
    End If

    [...]

  Next
Next

Merci pour vos commentaires

40
demandé sur EKI 2010-10-15 20:13:08

7 réponses

votre suggestion fonctionnerait, mais utiliser une boucle Do pourrait être un peu plus lisible.

c'est en fait un idiome en C - au lieu d'utiliser un goto, vous pouvez avoir une boucle de do { } while (0) avec une instruction break si vous voulez sortir de la construction plus tôt.

Dim i

For i = 0 To 10
    Do
        If i = 4 Then Exit Do
        WScript.Echo i
    Loop While False
Next

comme le suggère crush, il semble un peu mieux si vous retirez le niveau d'indentation supplémentaire.

Dim i

For i = 0 To 10: Do
    If i = 4 Then Exit Do
    WScript.Echo i
Loop While False: Next
40
répondu Tmdean 2013-11-21 16:57:40

Une option serait de mettre tout le code dans la boucle à l'intérieur d'un Sub et puis il suffit de retourner à partir de ce Sub quand vous voulez "continuer".

Pas parfait, mais je pense qu'il serait moins à confusion que la boucle supplémentaire.

Edit: Ou je suppose que si vous êtes assez courageux, vous pouvez utiliser une Goto pour sauter au début de la boucle d'une certaine manière (en s'assurant que le compteur est mis à jour correctement), je pense que VBScript supporte cela, mais votre réputation pourrait en souffrir si quelqu'un découvre que vous êtes à l'aide de Goto dans votre code :)

6
répondu Hans Olsson 2010-10-15 16:22:20

une solution que j'ai décidée implique l'utilisation d'une variable booléenne pour suivre si le for boucle doit traiter ses instructions ou passer à l'itération suivante:

Dim continue

For Each item In collection
    continue = True

    If condition1 Then continue = False End If

    If continue Then
        'Do work
    End If
Next

j'ai trouvé que les solutions de boucles imbriquées étaient quelque peu confuses sur le plan de la lisibilité. Cette méthode a aussi ses propres pièges puisque la boucle ne passe pas immédiatement à la prochaine itération après avoir rencontré continue. Il serait possible pour une condition ultérieure d'Inverser l'état de continue. Il dispose également d'un secondaire construction dans la boucle initiale, et nécessite la déclaration d'un var supplémentaire.

Oh, VBScript...soupir.

de plus, si vous voulez utiliser la réponse acceptée, ce qui n'est pas une mauvaise lisibilité, vous pouvez coupler cela avec l'utilisation de : fusionner les deux boucles dans ce qui semble être un:

Dim i

For i = 0 To 10 : Do
    If i = 4 Then Exit Do
    WScript.Echo i
Loop While False : Next

j'ai trouvé utile d'éliminer le niveau d'indentation.

6
répondu crush 2013-06-28 15:20:28

j'utilise souvent la boucle Do, mais j'ai commencé à utiliser un sous ou une fonction dont je pourrais sortir à la place. Il me semblait plus propre à moi. Si des variables dont vous avez besoin ne sont pas globales, vous devrez les passer au Sub également.

For i=1 to N
 DoWork i
Next

Sub DoWork(i)
    [Code]
    If Condition1 Then
      Exit Sub
    End If

    [MoreCode]
    If Condition2 Then
      Exit Sub
    End If

    [MoreCode]
    If Condition2 Then
      Exit Sub
    End If

    [...]
End Sub
4
répondu wsware 2010-10-20 19:43:41

implémenter l'itération comme une fonction récursive.

Function Iterate( i , N )
  If i == N Then
      Exit Function
  End If
  [Code]
  If Condition1 Then
     Call Iterate( i+1, N );
     Exit Function
  End If

  [Code]
  If Condition2 Then
     Call Iterate( i+1, N );
     Exit Function
  End If
  Call Iterate( i+1, N );
End Function

Démarrer avec un appel à l'Itération( 1, N )

0
répondu Captain Giraffe 2010-10-15 16:29:50

nous pouvons utiliser une fonction séparée pour effectuer un travail de déclaration continue. supposons que vous avez problème suivant:

for i=1 to 10

if(condition) then   'for loop body'
contionue
End If

Next

ici nous allons utiliser un appel de fonction pour le corps de boucle:

for i=1 to 10
Call loopbody()
next

function loopbody()

if(condition) then   'for loop body'
Exit Function
End If

End Function

boucle va continuer pour l'instruction de sortie de fonction....

0
répondu Ravi Likhar 2014-01-10 09:15:16

Essayez d'utiliser While/Wend Faire et / Boucle consolidés...

i = 1
While i < N + 1
Do While true
    [Code]
    If Condition1 Then
       Exit Do
    End If

    [MoreCode]
    If Condition2 Then
       Exit Do
    End If

    [...]

    Exit Do
Loop
Wend
0
répondu Máťa - Stitod.cz 2015-02-05 13:55:36