【问题标题】:"Continue" (to next iteration) on VBScriptVBScript 上的“继续”(到下一次迭代)
【发布时间】:2011-04-26 00:52:04
【问题描述】:

我和一位同事试图找出一种在 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

感谢您的cmets

【问题讨论】:

  • 哇!最好的答案就是问题本身;)

标签: vbscript iteration next continue


【解决方案1】:

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

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

【讨论】:

  • 如果有的话,我会使用 GoTo 转到循环的末尾,因此计数器变为 +1,但我开始明白 VBScript 上不支持 GoTo :P跨度>
  • VBSCRIPT 没有转到。这确实是继续寻求 OP 的重点。我没有标记你。建议你编辑一下。 :-)
  • @www-0av-Com 好吧,我确实说过“我认为”,虽然我不记得我 10 年前的想法 :)
【解决方案2】:

将迭代实现为递归函数。

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) 开始

【讨论】:

【解决方案3】:

您的建议可行,但使用 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

【讨论】:

  • 这还不错。如果您不想要额外的缩进级别,也可以使用:DoFor 放在同一行,将Loop While FalseNext 放在同一行。
  • 我不认为使用 : 将 Do 放在同一个 like 上会更好。乍一看,我看起来更干净,但读起来很混乱。我认为第一个版本(上图)更加清晰。
【解决方案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

【讨论】:

    【解决方案5】:

    我决定使用布尔变量来跟踪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
    

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

    【讨论】:

      【解决方案6】:

      我们可以使用单独的函数来执行 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
      

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

      【讨论】:

      • “exit sub”技术已经被提及两次;添加拼写错误和误用函数(无返回值)无济于事。
      【解决方案7】:

      尝试使用 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
      

      【讨论】:

      • Do... Loop While falseDo While true... Exit Do... Loop 干净
      【解决方案8】:

      我认为您打算将您的所有逻辑包含在您的 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
      

      这可以使代码更长一点,但有些人还是don't like break or continue

      【讨论】:

        【解决方案9】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-08
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-18
          • 1970-01-01
          相关资源
          最近更新 更多