2010-10-15 56 views
38

一位同事和我試圖找出一種在VBScript「For/Next」循環內執行等效「continue」語句的方法。VBScript上的「繼續」(到下一次迭代)

無論我們看什麼,我們發現人們沒有辦法在VBScript中做到這一點,沒有討厭的嵌套,這不是我們的選擇,因爲它是一個相當大的循環。

我們提出這個想法。它會像「繼續(到下一次迭代)」那樣工作嗎?有沒有人有更好的解決方法或改進建議?

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 

感謝您的意見

回答

38

您的建議會的工作,但使用Do循環可能會有點更具可讀性。

這實際上是一個C語言中的習慣用法,而不是使用goto,如果您想盡早地從結構中解脫出來,可以用break語句來做while(0)循環。

Dim i 

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

正如暗戀暗示的那樣,如果刪除額外的縮進級別,它看起來會好一點。

Dim i 

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

這並不算太壞。如果不需要額外的縮進級別,也可以使用':'將'Do'與'For'放在同一行,並將'While While False'與Next放在同一行。 – crush 2013-06-28 15:19:15

6

一個辦法是把所有的代碼迴路中的Sub裏面,當你想「繼續」然後就從Sub返回。

不完美,但我認爲這會讓額外的循環更容易混淆。

編輯:或者我想如果你足夠勇敢,你可以用Goto以某種方式跳到循環的開頭(確保計數器得到正確更新),我認爲VBScript支持這一點,但是你的如果有人發現您在代碼中使用Goto,聲譽可能會受損:)

+3

如果有的話,我會使用GoTo去循環結束,所以計數器goe s +1,但我已經明白,在VBScript上沒有GoTo支持:P – EKI 2010-10-16 23:42:23

0

將迭代實現爲遞歸函數。

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 

開始迭代調用(1,N)

+2

雖然你必須小心一點,但是如果N足夠大,這可能會導致一個Stackoverflow(如規範中所述:http://msdn.microsoft.com/en-us/library/x7hbf8fa%28VS.85%29.aspx)。 – 2010-10-15 16:36:28

4

我使用Do,Loop很多,但我已經開始使用一個Sub或一個我可以退出的函數。它對我來說似乎更清潔。如果你需要的變量不是全局的,你需要將它們傳遞給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

一個解決方案,我決定上涉及使用布爾變量的跟蹤如果for循環應該處理的指令或者跳到下一個迭代:

Dim continue 

For Each item In collection 
    continue = True 

    If condition1 Then continue = False End If 

    If continue Then 
     'Do work 
    End If 
Next 

我發現嵌套循環解決方案明智的可讀性有點令人困惑。該方法也有其自身的缺陷,因爲循環在遇到continue後不會立即跳到下一次迭代。稍後的條件將有可能扭轉continue的狀態。它在初始循環中也有一個輔助構造,並且需要聲明一個額外的變量。

哦,VBScript ...嘆了口氣。

另外,如果你想使用公認的答案,這是不是太糟糕可讀性明智的,你可以對夫婦的配合使用:兩個循環合併到這似乎是一個:

Dim i 

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

我發現它有助於消除額外的縮進級別。

0

我們可以使用單獨的函數來執行continue語句工作。假設你有以下的問題:

for i=1 to 10 

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

Next 

在這裏,我們將使用一個函數調用的循環體:

for i=1 to 10 
Call loopbody() 
next 

function loopbody() 

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

End Function 

循環將繼續退出函數聲明....

+0

'退出子'技術已經被提及兩次;添加拼寫錯誤和錯誤使用的函數(無返回值)不會有任何幫助。 – 2014-01-10 09:09:29

0

嘗試使用,而/ Wend和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