Quebra / saída aninhada em vb.net

122

Como faço para sair do aninhado ou loop no vb.net?

Eu tentei usar exit para, mas ele pulou ou violou apenas um loop apenas.

Como posso fazer o seguinte:

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
KoolKabin
fonte
O que o VB realmente precisa é de uma Exit For itemvariante da declaração, semelhante a Next item. Nos "bons velhos tempos", você poderia explicitamente Nexto loop externo. Hoje, o VB dá um erro. Claro, é mais "construtivo" Exit For.
ysap

Respostas:

199

Infelizmente, não há nenhuma exit two levels of fordeclaração, mas existem algumas soluções alternativas para fazer o que você deseja:

  • Goto . Em geral, usar gotoé considerado uma má prática (e com razão), mas usar gotosomente para um salto para frente de instruções de controle estruturadas é geralmente considerado bom, especialmente se a alternativa for ter um código mais complicado.

    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:
  • Bloco externo fictício

    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

    ou

    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
  • Função separada : Coloque os loops dentro de uma função separada, com a qual você pode sair return. No entanto, isso pode exigir que você passe muitos parâmetros, dependendo de quantas variáveis ​​locais você usa dentro do loop. Uma alternativa seria colocar o bloco em um lambda de várias linhas, pois isso criará um fechamento sobre as variáveis ​​locais.

  • Variável booleana : isso pode tornar seu código um pouco menos legível, dependendo de quantas camadas de loops aninhados você possui:

    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
Heinzi
fonte
3
Não se pode dizer que qualquer um deles seja melhor que o gotooutro que a função se realmente fizer sentido.
precisa saber é o seguinte
2
Vou usar isso gotoem um grande projeto apenas para lembrar meus dias de programação em qbasic, ah em tempos tão inocentes. caso contrário, eu iria fazer um manequim.
Sharky
1
Eu prefiro a abordagem Try/ Exit Try, mas não sou fã da gotoopção.
JohnH
Observe que o método "Variável booleana" requer várias variáveis ​​e testes à medida que o nível de aninhamento se torna mais profundo. Isso se torna
vago
1
@ syap - Na minha experiência, é raro precisar de várias variáveis ​​booleanas. Normalmente, há uma única condição de saída (por exemplo, "concluído") que, uma vez encontrada, todos os níveis de loop devem ser encerrados. No entanto, prefiro criar um método separado e usar "Return" - isso encapsula claramente a construção aninhada.
Home
16

Coloque os loops em uma sub-rotina e chame return

Tobias Schittkowski
fonte
1
Vale a pena notar que há sobrecarga associada a uma chamada que não está presente na gotosolução mais simples . Obviamente, se o código for reutilizável, ele já deve estar em uma função.
precisa
Como pode ser uma sobrecarga? @Dan
Altiano Gerung
@AltianoGerung Bem, meu comentário acima assume que o compilador não otimiza e alinha a chamada de função. Todas as chamadas de função (supondo que não sejam incorporadas pelo compilador) têm a sobrecarga do prólogo e do epílogo para atualizar o ponteiro da pilha base (assim como outras coisas como destruidores de chamada e coleta de lixo, se o idioma suportar). Isso geralmente é uma minúcia no grande esquema das coisas, mas existe e pode rapidamente se tornar aparente em ciclos apertados. pt.wikipedia.org/wiki/Function_prologue
Dan Bechard
@ Dan Bem, isso está além de mim LOL. Acho que com meus casos de uso e como a tecnologia melhora ao longo do tempo, nunca precisarei me preocupar com isso.
Altiano Gerung
2
@AltianoGerung Se há algo que a experiência me ensinou, é que com escala suficiente, até o menor dos problemas se torna grande o suficiente para importar. Como sempre, analise o perfil antes de fazer quaisquer suposições. :)
Dan Bechard
3

Faça o loop externo um loop while e "Exit While" na instrução if.

Andrew Thomas
fonte
Isso faz exatamente a mesma coisa que gotocom mais instruções, mais verbosidade e mais indentação. Qual é o objetivo?
precisa
3

Eu experimentei digitar "exit for" algumas vezes e notei que funcionava e o VB não gritava comigo. Acho que é uma opção, mas parecia ruim.

Eu acho que a melhor opção é semelhante à compartilhada por Tobias. Basta colocar seu código em uma função e fazer com que ele retorne quando você desejar interromper seus loops. Parece mais limpo também.

For Each item In itemlist
    For Each item1 In itemlist1
        If item1 = item Then
            Return item1
        End If
    Next
Next
Cesar
fonte
Não, vários "Exit For" s não resultam no comportamento desejado. O primeiro sai do primeiro loop, os adicionais nunca são alcançados, portanto não têm efeito. Além dessa sugestão, você parece ter simplesmente repetido respostas anteriores.
Home
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
Hitesh Paliwal
fonte
Não use isso. Seu comportamento está errado. Em vez disso, consulte a solução "variável booleana" da resposta aceita, de seis anos antes. Se fosse uma nova abordagem, eu explicaria o que a faz se comportar incorretamente, mas não vale a pena fazê-lo, pois a abordagem já foi mostrada corretamente na resposta anterior.
Home
0

Se eu quiser sair de um loop for-to, basta definir o índice além do limite:

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

Poppa.

Poppa Mintin
fonte
Eu recomendo mostrar como isso se aplica a esta pergunta. Pegue o código da pergunta e edite-o para usar essa abordagem.
Home