2010-10-15 11 views
38

Un collega e io stavamo cercando di capire un modo di fare l'equivalente di un'istruzione "continua" all'interno di un ciclo "For/Next" di VBScript."Continua" (a iterazione successiva) su VBScript

Ovunque guardassimo, abbiamo trovato che le persone non avevano modo di farlo in VBScript senza avere brutti raggruppamenti, il che non è un'opzione per noi dal momento che è un ciclo abbastanza grande.

Siamo usciti con questa idea. Funzionerebbe solo come "continua (alla prossima iterazione)"? Qualcuno ha qualche miglior soluzione o suggerimento di miglioramento?

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 

Grazie per i vostri commenti

risposta

38

tuo suggerimento avrebbe funzionato, ma utilizzando un ciclo Do potrebbe essere un po 'più leggibile.

Questo è in realtà un idioma in C - invece di utilizzare un goto, è possibile avere un ciclo do {} while (0) con un'istruzione break se si vuole uscire anticipatamente dal costrutto.

Dim i 

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

Come suggerisce schiacciamento, sembra un po 'meglio se si rimuove il livello di indentazione extra.

Dim i 

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

Questo non è male. Puoi anche usare ':' per mettere il 'Do' sulla stessa riga di' For' e 'Loop While False' sulla stessa riga di' Next' se non vuoi il livello di indentazione extra. – crush

6

Una possibilità sarebbe quella di mettere tutto il codice nel ciclo all'interno di un Sub e poi basta tornare da quel Sub quando si vuole "continua".

Non perfetto, ma penso che sarebbe meno confondente il loop in più.

Modifica: O suppongo che se sei abbastanza coraggioso potresti usare un Goto per saltare all'inizio del ciclo in qualche modo (assicurandoti che il contatore venga aggiornato correttamente), penso che VBScript supporti questo, ma il tuo la reputazione potrebbe risentire se qualcuno scopre che stai usando Goto nel tuo codice :)

+3

Se necessario, utilizzerei il GoTo per andare alla fine del ciclo in modo che il contatore goe s +1, ma ho capito che non c'è supporto per GoTo su VBScript: P – EKI

0

Implementa l'iterazione come funzione ricorsiva.

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 

Inizia con una chiamata a Iterate (1, N)

+2

Anche se devi stare un po 'attento, se N è abbastanza grande, questo potrebbe portare a StackOverflow (come menzionato nelle specifiche qui : http://msdn.microsoft.com/en-us/library/x7hbf8fa%28VS.85%29.aspx). –

4

Uso il Do, Loop molto, ma ho iniziato a utilizzare una Sub o una Funzione da cui avrei potuto uscire. Mi sembrava solo più pulito. Se alcune variabili di cui hai bisogno non sono globali, dovrai anche passarle 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 soluzione che ho deciso di coinvolgere l'uso di una variabile booleana per monitorare se il ciclo for deve elaborare le sue istruzioni o passare alla prossima iterazione:

Dim continue 

For Each item In collection 
    continue = True 

    If condition1 Then continue = False End If 

    If continue Then 
     'Do work 
    End If 
Next 

ho trovato le soluzioni di ciclo nidificate a essere un po 'confuso leggibilità saggio. Questo metodo ha anche le sue insidie ​​poiché il ciclo non salta immediatamente alla successiva iterazione dopo aver incontrato continue. Sarebbe possibile che una condizione successiva inverta lo stato di continue. Ha anche un costrutto secondario all'interno del ciclo iniziale e richiede la dichiarazione di una variabile extra.

Oh, VBScript ... sigh.

Inoltre, se si desidera utilizzare la risposta accettata, che non è troppo male leggibilità saggio, si potrebbe coppia che con l'uso di : per unire i due anelli in quello che sembra essere uno:

Dim i 

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

Ho trovato utile eliminare il livello extra di indentazione.

0

Possiamo utilizzare una funzione separata per eseguire un lavoro di istruzioni continue. si supponga di aver seguente problema:

for i=1 to 10 

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

Next 

Qui useremo una chiamata di funzione per per il corpo del ciclo:

for i=1 to 10 
Call loopbody() 
next 

function loopbody() 

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

End Function 

ciclo continuerà per la dichiarazione di funzione di uscita ....

+0

La tecnica "exit sub" era già stata menzionata due volte; aggiungere errori di battitura e una funzione abusata (nessun valore di ritorno) non aiuta nessuno. –

0

Prova Usa Mentre/Istruzioni Wend e Do While/Loop ...

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