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

94

Как выйти из вложенных или циклических в vb.net?

Я попытался использовать exit, но он прыгнул или разбился только на один цикл.

Как я могу сделать это для следующего:

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
  • 0
    Что действительно нужно VB, так это вариант оператора Exit For item , похожий на Next item . В «старые добрые времена» вы могли явно Next на следующий внешний цикл. Сегодня VB выдает ошибку. Конечно, вместо этого более «конструктивно» Exit For .
Теги:
for-loop
nested-loops

6 ответов

170
Лучший ответ

К сожалению, нет инструкции exit two levels of for, но есть несколько способов обхода:

  • Goto. В общем случае использование 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
    
  • 2
    Не могу сказать, что любой из них лучше, чем goto кроме функции, если это действительно имеет смысл.
  • 2
    Я собираюсь использовать это goto в большом проекте, чтобы вспомнить мои дни программирования в qbasic, ах такие невинные времена. в противном случае я бы пошел на манекен сделать.
Показать ещё 2 комментария
14

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

  • 1
    Стоит отметить, что с таким вызовом связаны накладные расходы, которых нет в более простом решении goto . Конечно, если код можно использовать повторно, он все равно должен быть в функции.
  • 0
    Как это может быть накладные расходы? @Dan
Показать ещё 3 комментария
4

Я экспериментировал с типизацией "exit for" несколько раз и заметил, что это сработало, и VB не кричал на меня. Это вариант, который я предполагаю, но он просто выглядел плохо.

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

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

Сделайте внешний цикл циклом while и "Exit While" в инструкции if.

  • 0
    Это делает то же самое, что и goto с большим количеством инструкций, большей многословностью и большим отступом. В чем смысл?
1
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
0

Попробуйте использовать "Выход для".

Это работает для меня.

;-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню