2010-10-15 17 views
38

Un colega y yo estábamos tratando de encontrar una forma de hacer el equivalente de una instrucción "continuar" dentro de un ciclo "Para/Siguiente" de VBScript."Continuar" (a la siguiente iteración) en VBScript

Por todas partes que miramos, encontramos personas que no tenían forma de hacerlo en VBScript sin tener malos anidados, lo que no es una opción para nosotros, ya que es un ciclo bastante grande.

Salimos con esta idea. ¿Funcionaría solo como "continuar (hasta la próxima iteración)"? ¿Alguien tiene alguna mejor solución o sugerencia de mejora?

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 

Gracias por tus comentarios

Respuesta

38

Tu sugerencia iba a funcionar, pero utilizando un bucle Do podría ser un poco más fácil de leer.

Esto es realmente una expresión idiomática en C: en lugar de usar un goto, puede tener un bucle do {} while (0) con una declaración de interrupción si desea rescatar la construcción anticipadamente.

Dim i 

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

Como sugiere crush, se ve un poco mejor si elimina el nivel de indentación adicional.

Dim i 

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

Esto no es tan malo. También puede usar ':' para poner 'Do' en la misma línea que' For' y 'Loop While False' en la misma línea que' Next' si no desea el nivel de indentación adicional. – crush

6

Una opción sería poner todo el código en el bucle dentro de un Sub y luego simplemente regresan de que Sub cuando se quiere "continuar".

No es perfecto, pero creo que sería menos confuso que el bucle adicional.

Editar: O supongo que si eres lo suficientemente valiente como para usar el Goto para saltar al principio del ciclo de alguna manera (asegurándote de que el contador se actualiza correctamente), creo que VBScript es compatible con eso, pero tu la reputación puede sufrir si alguien descubre que está usando Goto en su código :)

+3

Si hubiera, yo usaría el GoTo para ir al final del ciclo para que el contador goe s +1, pero he llegado a comprender que no hay soporte GoTo en VBScript: P – EKI

0

Implemente la iteración como una función recursiva.

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 

de inicio con una llamada a Iterar (1, N)

+2

Aunque debe tener un poco de cuidado, si N es lo suficientemente grande, esto podría conducir a un Stackoverflow (como se menciona en la especificación aquí) : http://msdn.microsoft.com/en-us/library/x7hbf8fa%28VS.85%29.aspx). –

4

que utilizo para utilizar el Do, Loop mucho, pero me han empezado a utilizar una sub o una función que podía salir fuera de su lugar. Simplemente me pareció más limpio. Si alguna de las variables que necesita no es global, deberá pasarlas también al Sub.

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 
6

Una solución decidí en implicado el uso de una variable booleana para rastrear si el bucle for debe procesar sus instrucciones o saltar a la siguiente iteración:

Dim continue 

For Each item In collection 
    continue = True 

    If condition1 Then continue = False End If 

    If continue Then 
     'Do work 
    End If 
Next 

Me pareció que las soluciones de bucle anidado para ser un poco confuso en cuanto a legibilidad. Este método también tiene sus propios inconvenientes, ya que el ciclo no salta inmediatamente a la siguiente iteración después de encontrar continue. Sería posible para una condición posterior invertir el estado de continue. También tiene una construcción secundaria dentro del ciclo inicial, y requiere la declaración de una var adicional.

Oh, VBScript ... suspiro.

Además, si desea utilizar la respuesta aceptada, lo cual no es demasiado mala legibilidad sabia, usted podría pareja que con el uso de : fusionar los dos bucles en lo que parece ser uno:

Dim i 

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

Me pareció útil eliminar el nivel extra de sangría.

0

Podemos utilizar una función separada para realizar un trabajo de declaración continua. supongamos que ha siguiente problema:

for i=1 to 10 

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

Next 

Aquí vamos a utilizar una llamada a la función de bucle para el cuerpo:

for i=1 to 10 
Call loopbody() 
next 

function loopbody() 

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

End Function 

bucle continuará para la declaración de salida de la función ....

+0

La técnica 'exit sub' ya fue mencionada dos veces; agregar errores tipográficos y una función mal utilizada (sin valor de retorno) no ayuda a ninguno. –

0

Probar Usar Mientras/Wend and Do While/Loop declaraciones ...

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 
Cuestiones relacionadas