vb.netで入れ子になっているBreaking / exit


122

vb.netのネストされたforまたはループから抜け出すにはどうすればよいですか?

私はexit forを使ってみましたが、ジャンプしたり壊れたりしたのはforループのみです。

どうすれば次のことができますか?

for each item in itemList
     for each item1 in itemList1
          if item1.text = "bla bla bla" then
                exit for
          end if
     end for
end for

VBが実際に必要とするExit For itemのは、のようなステートメントのバリアントですNext item。「古き良き時代」ではNext、明示的に外側のループを使用できます。今日、VBはエラーを出します。もちろん、Exit For代わりに「建設的」です。
ysap

回答:


199

残念ながら、exit two levels of forステートメントはありませんが、あなたが望むことをするためのいくつかの回避策があります:

  • 後藤。一般に、使用goto悪い習慣と見なされますgoto当然のことですが)、構造化された制御ステートメントの前方ジャンプのみに使用することは、特に代替手段がより複雑なコードを持つ場合は、通常は問題ないと見なされます。

    For Each item In itemList
        For Each item1 In itemList1
            If item1.Text = "bla bla bla" Then
                Goto end_of_for
            End If
        Next
    Next
    
    end_of_for:
  • ダミーアウターブロック

    Do
        For Each item In itemList
            For Each item1 In itemList1
                If item1.Text = "bla bla bla" Then
                    Exit Do
                End If
            Next
        Next
    Loop While False

    または

    Try
        For Each item In itemlist
            For Each item1 In itemlist1
                If item1 = "bla bla bla" Then
                    Exit Try
                End If
            Next
        Next
    Finally
    End Try
  • 別の関数:ループを別の関数内に配置します。この関数はで終了できますreturn。ただし、ループ内で使用するローカル変数の数によっては、多くのパラメーターを渡す必要があります。代替策は、ブロックを複数行のラムダに入れることです。これにより、ローカル変数に対するクロージャーが作成されます。

  • ブール変数:ネストされたループのレイヤーの数によっては、コードが読みにくくなる場合があります。

    Dim done = False
    
    For Each item In itemList
        For Each item1 In itemList1
            If item1.Text = "bla bla bla" Then
                done = True
                Exit For
            End If
        Next
        If done Then Exit For
    Next

3
gotoそれが実際に理にかなっている場合、それらのいずれも機能以外のものより優れているとは言えません。
Chris Marisic 2014

2
私はgoto、qbasicでのプログラミングの日を覚えているだけの大きなプロジェクトでそれを使用します。そうでなければ、私はダミーのことをします。
Sharky

1
私はTry/ Exit Tryアプローチを好みますが、私はそのgotoオプションのファンではありません。
JohnH

「ブール変数」メソッドでは、ネストレベルが深くなるにつれて、複数の変数とテストが必要になることに注意してください。これは不明瞭になります...
ysap

1
@ysap-私の経験では、複数のブール変数が必要になることはまれです。通常、単一の終了条件(「done」など)が発生すると、すべてのループレベルが終了します。それでも、別のメソッドを作成して「Return」を使用することをお勧めします。これにより、ネストされた構造がクリーンにカプセル化されます。
ToolmakerSteve

16

ループをサブルーチンに入れて呼び出す return


1
より単純なgotoソリューションには存在しない、このような呼び出しに関連するオーバーヘッドがあることは注目に値します。もちろん、コードが再利用可能であれば、それはとにかく関数の中にあるはずです。
Dan

どのようにそれはオーバーヘッドになることができますか?@ダン
Altiano

@AltianoGerungさて、上記の私のコメントは、コンパイラが関数呼び出しを最適化してインライン化しないことを前提としています。すべての関数呼び出し(コンパイラーによってインライン化されていないと想定)には、基本スタックポインターを更新するためのプロローグとエピローグのオーバーヘッドがあります(また、言語がサポートしている場合は、デストラクターの呼び出しやガベージコレクションを実行します)。これは多くの場合、大規模な計画では細目ですが、存在し、タイトなループですぐに明らかになる可能性があります。en.wikipedia.org/wiki/Function_prologue
Dan Bechard、

@ダンまあ、それは私を超えています笑 私の使用例とテクノロジーが時間とともにどのように向上するかについて、私はそれについて心配する必要はないと思います。
Altiano Gerung

2
@AltianoGerung経験から学んだことがあれば、十分な規模があれば、小さな問題でも問題になるほど大きくなります。いつものように、仮定を行う前にプロファイルを作成します。:)
Dan Bechard、2018年

3

外側のループをwhileループにし、ifステートメントで "Exit While"にします。


これは、gotoより多くの指示、より多くの冗長性、およびより多くのインデントの場合とまったく同じです。ポイントは何ですか?
Dan Bechard、

3

「exit for」と何度か入力してみたところ、うまくいき、VBは私に怒鳴りませんでした。これは私が推測するオプションですが、見た目が悪いだけです。

最良の選択肢はトビアスが共有するものと同様だと思います。コードを関数に入れて、ループから抜け出すときにコードを返すだけです。あまりにもきれいに見えます。

For Each item In itemlist
    For Each item1 In itemlist1
        If item1 = item Then
            Return item1
        End If
    Next
Next

いいえ、「Exit For」が複数あると、望ましい動作が得られません最初のループは最初のループを終了し、追加のループには到達しないため、影響はありません。その提案以外に、あなたは単に以前の答えを繰り返したようです。
ToolmakerSteve

3
For i As Integer = 0 To 100
    bool = False
    For j As Integer = 0 To 100
        If check condition Then
            'if condition match
            bool = True
            Exit For 'Continue For
        End If
    Next
    If bool = True Then Continue For
Next

これは使用しないでください。その動作は間違っています。代わりに、6年前から受け入れられた回答の「ブール変数」ソリューションを参照してください。それが新しいアプローチである場合、私はそれが正しく動作しない原因を説明しますが、そのアプローチは以前の回答ですでに正しく示されているため、そうする価値はありません。
ToolmakerSteve

0

for-toループを終了する場合は、インデックスを制限を超えて設定します。

    For i = 1 To max
        some code
        if this(i) = 25 Then i = max + 1
        some more code...
    Next`

ポッパ。


これがこの質問にどのように適用されるかを示すことをお勧めします。質問からコードを取り出し、このアプローチを使用するように編集します。
ToolmakerSteve
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.