Взлом / выход вложен в vb.net

Как мне выйти из вложенного цикла или цикла в vb.net?

Я пробовал использовать 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

person KoolKabin    schedule 15.03.2011    source источник
comment
Что действительно нужно VB, так это Exit For item вариант оператора, похожий на Next item. В старые добрые времена вы могли явно Next внешний цикл. Сегодня VB выдает ошибку. Конечно, вместо этого было бы более конструктивно Exit For.   -  person ysap    schedule 07.08.2018


Ответы (6)


К сожалению, здесь нет оператора 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
    

    or

    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
    
person Heinzi    schedule 15.03.2011
comment
Не могу сказать, что что-то из этого лучше, чем goto, кроме функции, если это действительно имеет смысл. - person Chris Marisic; 21.08.2014
comment
Я собираюсь использовать этот goto в большом проекте, просто чтобы вспомнить свои дни программирования на qbasic, такие невинные времена. в противном случае я бы пошел на манекен. - person Sharky; 03.03.2015
comment
Я предпочитаю подход Try / Exit Try, но я не поклонник варианта goto. - person JohnH; 25.05.2016
comment
Обратите внимание, что метод логической переменной требует нескольких переменных и тестов по мере углубления уровня вложенности. Это становится уродливым ... - person ysap; 07.08.2018
comment
@ysap - По моему опыту, редко требуется несколько логических переменных. Как правило, существует единственное условие выхода (например, выполнено): при его обнаружении необходимо выйти из всех уровней цикла. Тем не менее, я предпочитаю создавать отдельный метод и использовать Return - это чисто инкапсулирует вложенную конструкцию. - person ToolmakerSteve; 26.05.2019

Поместите циклы в подпрограмму и вызовите return

person Tobias Schittkowski    schedule 15.03.2011
comment
Стоит отметить, что с таким вызовом связаны накладные расходы, которых нет в более простом решении goto. Конечно, если код можно использовать повторно, он в любом случае уже должен быть в функции. - person Dan Bechard; 03.03.2016
comment
Как это могут быть накладные расходы? @Dan - person Altiano Gerung; 02.05.2018
comment
@AltianoGerung Ну, мой комментарий выше предполагает, что компилятор не оптимизирует и не встраивает вызов функции. Все вызовы функций (при условии, что они не встроены компилятором) имеют накладные расходы на пролог и эпилог для обновления указателя базового стека (а также на другие вещи, такие как вызов деструкторов и сборку мусора, если язык это поддерживает). Это часто является мелочью в общей схеме вещей, но действительно существует и может быстро проявиться в замкнутых кругах. en.wikipedia.org/wiki/Function_prologue - person Dan Bechard; 08.05.2018
comment
@Dan Ну, это вне меня, LOL. Я думаю, что с моими вариантами использования и тем, как технологии со временем улучшаются, мне никогда не придется об этом беспокоиться. - person Altiano Gerung; 08.05.2018
comment
@AltianoGerung Если чему-то меня научил, так это тому, что при достаточном масштабе даже самые маленькие проблемы становятся достаточно большими, чтобы иметь значение. Как всегда, сделайте профиль, прежде чем делать какие-либо предположения. :) - person Dan Bechard; 10.05.2018

Сделайте внешний цикл циклом while и «Exit While» в операторе if.

person Andrew Thomas    schedule 29.05.2012
comment
Это делает то же самое, что и goto, с большим количеством инструкций, большей детализацией и большим количеством отступов. В чем смысл? - person Dan Bechard; 03.03.2016

Я несколько раз экспериментировал с вводом «exit for» и заметил, что это работает, и VB не кричал на меня. Думаю, это вариант, но он выглядел плохо.

Я думаю, что лучший вариант аналогичен тому, который предлагает Тобиас. Просто вставьте свой код в функцию и верните его, когда захотите выйти из цикла. Тоже выглядит чище.

For Each item In itemlist
    For Each item1 In itemlist1
        If item1 = item Then
            Return item1
        End If
    Next
Next
person Cesar    schedule 06.02.2013
comment
Нет, множественный выход за не приводит к желаемому поведению. Первый выходит из цикла first, дополнительные никогда не достигаются, поэтому не имеют никакого эффекта. Помимо этого предложения, вы, кажется, просто повторили предыдущие ответы. - person ToolmakerSteve; 26.05.2019

Если я хочу выйти из цикла for-to, я просто устанавливаю индекс за пределом:

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

Папа.

person Poppa Mintin    schedule 10.04.2019
comment
Я рекомендую показать, как это применимо к этому вопросу. Возьмите код из вопроса и отредактируйте его, чтобы использовать этот подход. - person ToolmakerSteve; 26.05.2019

person    schedule
comment
Не используйте это. Его поведение неправильное. Вместо этого посмотрите принятое решение логической переменной ответа от шести лет назад. Если бы это был новый подход, я бы объяснил, что заставляет его вести себя неправильно, но этого не стоит делать, поскольку подход уже был правильно показан в том предыдущем ответе. - person ToolmakerSteve; 26.05.2019