在VBScript上"继续"(到下一次迭代)

EKI*_*EKI 44 iteration vbscript continue next

我和一位同事试图在VBScript"For/Next"循环中找到一种相当于"continue"语句的方法.

我们看到的每个地方都发现人们没有办法在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
Run Code Online (Sandbox Code Playgroud)

感谢您的意见

Tmd*_*ean 43

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

这实际上是C中的一个成语 - 而不是使用goto,如果你想尽早摆脱构造,你可以使用break语句进行do {} while(0)循环.

Dim i

For i = 0 To 10
    Do
        If i = 4 Then Exit Do
        WScript.Echo i
    Loop While False
Next
Run Code Online (Sandbox Code Playgroud)

如同粉碎所示,如果你删除额外的缩进级别,它看起来会好一些.

Dim i

For i = 0 To 10: Do
    If i = 4 Then Exit Do
    WScript.Echo i
Loop While False: Next
Run Code Online (Sandbox Code Playgroud)

  • 这不是太糟糕.如果你不想要额外的缩进级别,你也可以使用`:`将`Do`放在与`For`相同的行上,并将`Loop While False`放在与`Next`相同的行上. (6认同)
  • 我不认为使用 : 将 Do 放在相同的位置上会更好。乍一看我看起来更干净,但读起来很混乱。我认为第一个版本(以上)更加清晰和清晰。 (2认同)

cru*_*ush 7

我决定使用一个布尔变量来跟踪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
Run Code Online (Sandbox Code Playgroud)

我发现嵌套循环解决方案有点令人困惑的可读性.这种方法也有其自身的缺陷,因为循环在遇到后不会立即跳到下一次迭代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
Run Code Online (Sandbox Code Playgroud)

我发现消除额外的压痕水平很有用.


Han*_*son 6

一种选择是将循环中的所有代码放在a中Sub,然后Sub在你想要"继续"时从那里返回.

不完美,但我认为额外的循环不会让人感到困惑.

编辑:或者我想如果你足够勇敢,你可以使用a Goto以某种方式跳转到循环的开头(确保计数器正确更新),我认为VBScript支持,但如果有人你的声誉可能会受到影响发现你Goto在你的代码中使用:)

  • 如果有的话,我会使用GoTo去循环结束,所以计数器变为+1,但我已经明白在VBScript上没有GoTo支持:P (3认同)

wsw*_*are 5

我过去经常使用 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
Run Code Online (Sandbox Code Playgroud)