vb.net에 중첩 된 중단 / 종료


122

vb.net의 중첩 된 for 또는 루프에서 벗어나려면 어떻게해야합니까?

나는 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

답변:


199

안타깝게도 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

3
goto실제로 의미가 있다면 기능보다 다른 것보다 낫다고 말할 수 없습니다 .
Chris Marisic 2014-08-20

2
나는 gotoqbasic에서의 프로그래밍 시절을 기억하기 위해 큰 프로젝트에서 그것을 사용할 것 입니다. 그렇지 않으면 나는 더미 할 것입니다.
Sharky

1
나는 Try/ Exit Try접근 방식을 선호 하지만 goto옵션의 팬이 아닙니다 .
JohnH

"부울 변수"메서드에는 중첩 수준이 더 깊어짐에 따라 여러 변수와 테스트가 필요합니다. 이것은
흐릿

1
@ysap-내 경험상 여러 부울 변수가 필요한 경우는 드뭅니다. 일반적으로 일단 발생하면 모든 루프 레벨을 종료해야하는 단일 종료 조건 (예 : "완료")이 있습니다. 그럼에도 불구하고 나는 별도의 메서드를 만들고 "Return"을 사용하는 것을 선호합니다. 이것은 중첩 된 구조를 깔끔하게 캡슐화합니다.
ToolmakerSteve

16

루프를 서브 루틴에 넣고 호출 return


1
더 간단한 goto솔루션 에는없는 이러한 호출과 관련된 오버 헤드가 있다는 점은 주목할 가치가 있습니다. 물론 코드를 재사용 할 수 있다면 어쨌든 이미 함수에 있어야합니다.
Dan Bechard

어떻게 오버 헤드가 될 수 있습니까? @Dan
Altiano Gerung

@AltianoGerung 글쎄, 위의 의견은 컴파일러가 함수 호출을 최적화하고 인라인하지 않는다고 가정합니다. 모든 함수 호출 (컴파일러에 의해 인라인되지 않는다고 가정)에는 기본 스택 포인터를 업데이트하기위한 프롤로그 및 에필로그의 오버 헤드가 있습니다 (또한 언어가 지원하는 경우 소멸자 호출 및 가비지 수집과 같은 다른 작업 수행). 이것은 종종 웅장한 계획의 사소한 부분이지만 존재하며 타이트한 루프에서 빠르게 분명해질 수 있습니다. en.wikipedia.org/wiki/Function_prologue
Dan Bechard

@ 댄 글쎄, 그것은 나를 넘어 LOL입니다. 내 사용 사례와 시간이 지남에 따라 기술이 어떻게 향상되는지에 대해 걱정할 필요가 없다고 생각합니다.
Altiano Gerung

2
@AltianoGerung 저에게 배운 경험이 있다면, 규모가 충분하면 아무리 작은 문제라도 문제가 될만큼 커진다는 것입니다. 항상 그렇듯이 가정하기 전에 프로파일 링하십시오. :)
Dan Bechard

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

아니요, 여러 "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.