2012-03-06 3 views
1

나는 내부 루프를 벗어날 필요가 있고 출구 루프가 그렇게하는 것이 최선의 방법이 아니라는 조언을 받았습니다. 그래서 나는 그렇게 할 다른 방법을 생각해 봤는데, if 문 내에서 값을 가져오고 싶지만 제대로 작동하지 않는 것 같습니다.내부 루프에서 벗어날 수 없습니까?

While Bavailable = True 

      For Each position In MyPosList 

       If creditPoints = "20" And semester = "1" And year = "Year 1" Then 
        Blongthin = False 
        BlongFat = False 
        If position.strLabel = "a1" And available(0) = "True" Then 

         pos = position.strX & " " & position.strY 
         count += 1 
         available(0) = blnavailable 
         Bavailable = False 
         MsgBox(Bavailable) 

        ElseIf position.strLabel = "b1" And available(1) <> "False" Then 
         pos = position.strX & " " & position.strY 
         'position.blnAvail = False 
         count += 1 
         available(1) = blnavailable 
         Bavailable = False 

        ElseIf position.strLabel = "c1" And available(2) <> "False" Then 
         pos = position.strX & " " & position.strY 
         position.blnAvail = False 
         count += 1 
         available(2) = blnavailable 
         Bavailable = False 
        End If 

당신은 내가 조건에 해당하는 반환의 경우 이들 중 하나의 인스턴스에 값 POS를 얻기 위해 시도하고 루프의 탈옥 Bavailable를 사용하고 있음을 볼 수? 어떤 도움?

+0

헝가리 유형 표기? – asawyer

답변

0

모든 항목을 반복하지 않으려는 경우 For 루프를 사용하는 것을 좋아하지 않습니다. 이 상황에서 나는 While을 선호한다. 어떻게 같은 약 :

Dim index As Integer 
index = 0 

While Not Found And index < MyPosList.Count 
    ' Do whatever and update Found when required 
    index = index + 1 
While End 
0

시도 :

While Bavailable 
     For Each position In MyPosList 
      If Bavailable Then 'Add loop controls to inner loop 
       If creditPoints = "20" And semester = "1" And Year() = "Year 1" Then 
        Blongthin = False 
        BlongFat = False 
        If position.strLabel = "a1" And available(0) = "True" Then 
         pos = position.strX & " " & position.strY 
         count += 1 
         available(0) = blnavailable 
         Bavailable = False 
         MsgBox(Bavailable) 

        ElseIf position.strLabel = "b1" And available(1) <> "False" Then 
         pos = position.strX & " " & position.strY 
         'position.blnAvail = False 
         count += 1 
         available(1) = blnavailable 
         Bavailable = False 

        ElseIf position.strLabel = "c1" And available(2) <> "False" Then 
         pos = position.strX & " " & position.strY 
         position.blnAvail = False 
         count += 1 
         available(2) = blnavailable 
         Bavailable = False 
        End If 
       End If 
      End If 
     Next position 
    End While 

내가 정확히 Exit ForExit While에 대한 잘못된 것에 매우 관심이 있지만 ...

+0

구조화 된 프로그래밍의 개념을 깬다. Exit, Exit While 및 Goto 문의 차이점은 무엇입니까? –

+0

'Goto'가 나쁘다는 것에 동의합니다. 그래서 1984 년에 사용을 중단했습니다. 그러나'Exit' 문과'Goto' 문에는 상당한 차이가 있습니다. 'Exit'문 (for, while 등)은 루프를 깨끗하게 종료하고 프로그램 제어는 루프 다음의 다음 명령문에서 재개됩니다. 'Goto' 문은 코드 기반의 임의의 행으로 점프 할 수 있습니다. 'Exit' 문은 ** 구조화 된 프로그래밍의 개념을 깨뜨리지 않습니다 **. 그들은 사실 의도적으로 ** 구조화 된 프로그래밍의 개념을 유지하는 데 도움이되는 언어입니다. – pete

+0

IMHO 의견에는 메소드에 하나의 진입 점과 하나의 종료점이 있어야합니다. 다른 단축키는 메서드의 실제 논리를 숨기고 그 구조를 끊습니다. –

0

Exit For 또는 Exit While 경우 코드를 더하게 읽을 수있는, 그들을 사용! 유일한 목적으로 불필요한 복잡성이 추가되는 변수를 추가해도 의미가 없습니다.

대부분의 내부 논리를 별도의 기능으로 옮길 수 있다면 더욱 좋습니다.

+0

완전히 동의하지 마십시오. 피트 대답에서 내 의견을 읽어보십시오. 물론, 코드를 더 읽기 쉽게 만드는 것은 무엇이든하십시오. 그러나 실행 흐름을 중단시키는 문장은 코드를 더 읽기 쉽게합니다. –

+0

return 문도 똑같은 일을한다. 실행의 흐름을 깨뜨린다. (당신이 최대로 제한하지 않는 한, 함수 당 마지막 행으로 하나의 리턴). – Michael

+0

이것은 내가 항상하는 일입니다. 내 메소드는 항상 하나의 진입 점과 하나의 종료점을가집니다. 그것은 구조화 된 프로그램 IMHO입니다. –

1

전제에 동의하지 않습니다. 외부의 while 루프를 사용하는 이유가 Exit For을 사용하지 않으려면 While을 제거해야합니다. For 내부의 상황이 정말 길고 스포츠에서 뛰어 내리는 것을 피하려면 다음을 수행하십시오.

For Each position In MyPosList 

    Dim breakEarly As Boolean = False 

    If someCondition Then 

     'logic, logic, logic 
     'logic, logic, logic 
     'logic, logic, logic 
     breakEarly = True 

    ElseIf someOtherCondition Then 

     'logic, logic, logic 
     'logic, logic, logic 
     'logic, logic, logic 
     breakEarly = True 

    ElseIf etc, 
    ElseIf etc, 
    ElseIf etc, 
    End If 

    If breakEarly Then 

     'do any common pre-exit code here 

     'now bail 
     Exit For 

    End If 

Next 
+0

나는 동의하지 않는다. 컬렉션의 일부만 처리하려면 While을 사용하십시오. 당신이 전체 컬렉션 사용을 처리하고 싶다면. –

+0

@somos Ack, 잘못된 게시물, 어리석은 전화에 댓글을 달았습니다. 위의 내 노트를 참조하십시오. 또한 foreach는 인덱스 변수를 사용하는 것이 현명하지 않은 경우 많은 상황에서 코드를 더 쉽게 읽을 수 있습니다. 예를 들어, foreach는 링크 된 목록에서 인덱스 기반 반복을 크게 능가합니다. – tcarvin

관련 문제