50

同僚と私は、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

コメントしてくれてありがとう

4

9 に答える 9

47

あなたの提案はうまくいくでしょうが、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

クラッシュが示唆するように、余分なインデントレベルを削除すると少し良く見えます。

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ます。また、初期ループ内に2次構造があり、追加の変数の宣言が必要です。

ああ、VBScript...ため息をつく。

また、受け入れられた答えを使用したい場合は、読みやすさの点でそれほど悪くはありませんが、を使用:して2つのループを1つに見えるものにマージすることができます。

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

1つのオプションは、すべてのコードを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

関数exitステートメントに対してループが続行されます...。

于 2014-01-10T08:55:21.303 に答える
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

While/WendおよびDoWhile/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

私はあなたがあなたの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 に答える
0

私はいつもDoWhileループを使用してきました。これは、両方のForタイプループで機能します。

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

私見、これはきれいに見えます。一番下にCrushの答えが表示されました。回答が重複してすみません。

于 2021-03-31T12:49:16.097 に答える