50

我和一位同事试图找出一种在 VBScript“For/Next”循环中执行相当于“继续”语句的方法。

在我们所见之处,我们发现人们无法在 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

感谢您的意见

4

9 回答 9

47

您的建议可行,但使用 Do 循环可能更具可读性。

这实际上是 C 中的一个习惯用法 - 如果您想尽早退出该构造,则可以使用带有 break 语句的 do { } while (0) 循环,而不是使用 goto。

Dim i

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

正如crush 所暗示的,如果您删除额外的缩进级别,它看起来会更好一些。

Dim i

For i = 0 To 10: Do
    If i = 4 Then Exit Do
    WScript.Echo i
Loop While False: Next
于 2010-10-15T17:33:12.363 回答
8

我决定的一个解决方案涉及使用布尔变量来跟踪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。它在初始循环中还有一个辅助构造,并且需要声明一个额外的 var。

哦,VBScript...叹息。

此外,如果您想使用已接受的答案,这在可读性方面还不错,您可以将其与使用结合:起来,将两个循环合并为一个:

Dim i

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

我发现消除额外的缩进级别很有用。

于 2013-06-28T15:14:41.117 回答
6

一种选择是将循环中的所有代码放在 a 内Sub,然后Sub在您想“继续”时从该循环中返回。

不完美,但我认为额外的循环不会那么混乱。

于 2010-10-15T16:22:20.800 回答
4

我过去经常使用 Do、Loop,但我已经开始使用可以退出的 Sub 或 Function。它对我来说似乎更干净。如果您需要的任何变量不是全局变量,您还需要将它们传递给 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
于 2010-10-20T19:43:41.943 回答
1

我们可以使用单独的函数来执行 continue 语句工作。假设您有以下问题:

for i=1 to 10

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

Next

在这里,我们将使用 for 循环体的函数调用:

for i=1 to 10
Call loopbody()
next

function loopbody()

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

End Function

对于函数退出语句,循环将继续......

于 2014-01-10T08:55:21.303 回答
0

尝试使用 While/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
于 2015-02-05T13:55:36.307 回答
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

从调用 Iterate( 1, N ) 开始

于 2010-10-15T16:29:50.640 回答
0

我一直使用 Do While 循环。这适用于两个 For 类型的循环。

For iIndex = 0 to 100
  Do
    If bCondition then Exit Do
    ...
  Loop While False
Next 

恕我直言,这看起来很干净。我刚刚在底部看到了 Crush 的答案。抱歉重复的答案。

于 2021-03-31T12:49:16.097 回答
0

我认为你打算在你的if陈述中包含你所有的逻辑。基本上:

' PRINTS EVERYTHING EXCEPT 4
For i = 0 To 10
  ' you want to say
  ' If i = 4 CONTINUE but VBScript has no continue
  If i <> 4 Then ' just invert the logic
    WSH.Echo( i )
  End If
Next

这可以使代码更长一点,但有些人不喜欢breakcontinue无论如何。

于 2019-09-05T16:04:38.233 回答