"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
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
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 :)
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.
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
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 )
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....
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