在vb.net中嵌套/中断的退出


122

如何摆脱vb.net的嵌套或循环?

我尝试使用exit用于,但是它仅跳跃或中断了一个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

Answers:


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。但是,这可能需要您传递很多参数,具体取决于您在循环中使用了多少个局部变量。一种替代方法是将块放入多行lambda中,因为这将创建局部变量的闭包。

  • 布尔变量:这可能会使代码的可读性降低,具体取决于您拥有多少层嵌套循环:

    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如果确实有意义,那么不能说这些功能中的任何一个都比该功能更好。
克里斯·马里西克

2
我将goto在一个大型项目中使用它,只是为了回想起我在qbasic编程的日子,啊,这天真无邪。否则我会去做一个假人。
Sharky 2015年

1
我更喜欢Try/ Exit Try方法,但是我不喜欢该goto选项。
JohnH

请注意,“布尔变量”方法需要多个变量并随着嵌套级别的提高而进行测试。这变得丑陋了……
ysap

1
@ysap-以我的经验,它很少需要多个布尔变量。通常,只有一个退出条件(例如“完成”),一旦遇到该条件,就应退出所有循环级别。不过,我更喜欢制作一个单独的方法,并使用“ Return”-这样可以干净地封装嵌套的构造。
ToolmakerSteve

16

将循环放在子例程中并调用 return


1
值得注意的是,与这种调用相关的开销在较简单的goto解决方案中是不存在的。当然,如果代码是可重用的,无论如何它应该已经在一个函数中。
Dan Bechard

怎么会有开销呢?@Dan
Altiano Gerung

@AltianoGerung好吧,我在上面的评论假设编译器没有优化并内联函数调用。所有函数调用(假设编译器未内联它们)都具有更新基本堆栈指针的序言和结尾的开销(以及其他诸如调用析构函数之类的操作,并且在语言支持的情况下进行垃圾回收)。在宏伟的事物中,这通常是细节,但确实存在,并且在紧密的循环中会很快变得明显。en.wikipedia.org/wiki/Function_prologue
丹·贝查德

@Dan好吧,这超出了我的笑声。我认为随着我的用例以及技术随着时间的推移如何改进,我将永远不必担心它。
Altiano Gerung '18年

2
@AltianoGerung如果有什么经验教给我,那就是有足够的规模,即使最小的问题也变得足够重要。与往常一样,在进行任何假设之前先进行介绍。:)
丹·贝查德

3

使外部循环为while循环,然后在if语句中为“ Exit While”。


goto与更多的指令,更多的冗长性和更多的缩进功能完全相同。重点是什么?
Dan Bechard

3

我尝试过几次输入“ exit for”(退出),发现它可以正常工作,而VB并没有对我大喊大叫。我猜这是一个选择,但是看起来很糟糕。

我认为最好的选择类似于Tobias的选择。只需将您的代码放入函数中,并在您想退出循环时返回它即可。看起来也更干净。

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

不,多个“退出为” 不会导致所需的行为。第一个退出第一个循环,再也不会到达其他循环,因此没有任何作用。除了该建议,您似乎只是重复了先前的答案。
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

不要使用这个。它的行为是错误的。相反,请查看六年前被接受的答案的“布尔变量”解决方案。如果这是一种新方法,我将解释是什么导致了它的行为不正确,但这样做不值得,因为该方法已在较早的答案中正确显示。
ToolmakerSteve

0

如果要退出循环循环,只需将索引设置为超出限制即可:

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

爸爸


我建议显示这如何应用于此问题。从问题中获取代码,然后对其进行编辑以使用此方法。
制造商史蒂夫,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.