2010-12-22 6 views
1

나는 4 단체 "가내부 루프에서 바깥 쪽 루프로 벗어나는 방법?

ObjectA, ObjectB, ObjectC, ObjectD 내가 WASS을 찾고 무엇을 찾을 때

foreach(ObjectA objectA in listObjectA) 
if (relationAB) 
    foreach(ObjectB objectB in listObjectB) 
    if (relationBC) 
    foreach(ObjectC objectC in listObjectC) 
    if (relationCD) 
     foreach(ObjectD objectD in listObjectD) 
     if (I found what I'm looking for) 
     Do something 

그래서, 나는에 대한 첫 번째로, 첫 번째 줄에 가고 싶다 하지만, 목록에서 두 번째 요소에 나는이 작업을 수행 할 수있는 방법 성령 강림절 고토

나중에 편집 :.?이 질문은 C#을위한

PS 당신이 더 좋은 방법은 내가 노력하고있어 할 생각 없습니다. 해야 할 일, 4 회 사용시 없음

+0

이것은 언어에 따라 다릅니다. –

+0

PS에서이 쿼드 임베딩을 요구하는 목록이 어떤 방식으로 관련되어 있습니까? 장난감 예에서 4 가지 개별 검색을 수행 할 수없는 이유는 없습니다. –

답변

7

글쎄, 이것은 단지 "프로그래밍 언어"문제 일 뿐이므로 일반적으로 언어 기능을 사용하여 루프를 명명 한 다음 "break"문에 적절한 이름을 지정하는 것이 일반적입니다.

슬프게도 나는 C와 C++의 최신 버전이 그런 것을 지원하지 않는다고 생각합니다. 따라서 사용하기 위해서는 goto에 의존해야합니다. 이를 회피하는 좋은 방법은 루프를 자신의 서브 루틴에 넣고, break 대신에 return을 실행하는 것입니다. 그것이 저 빈곤 언어로 일할 때 제가 일반적으로하는 일입니다.

수정 된 예는 다음과 같습니다

void find_whatever (/* probably pass in the lists or objects to search for*/) 
    foreach(ObjectA objectA in listObjectA) 
    if (relationAB) 
     foreach(ObjectB objectB in listObjectB) 
     if (relationBC) 
      foreach(ObjectC objectC in listObjectC) 
      if (relationCD) 
       foreach(ObjectD objectD in listObjectD) 
       if (I found what I'm looking for) 
       Do something 
       return; 

참고 : 태그는 "프로그래밍 언어" "C 번호"로 변경되었습니다. 그것은 질문에 대해 옳은 일 이었지만, 많은 사람들이이 답변을 좋아해서 개조를하지 않았습니다.

+1

C 및 C++은 라벨이있는 나누기를 지원하지 않기 때문에 좋지 않습니다 .-) – darioo

+0

@darioo - 사실입니다. 다른 많은 이유가 있습니다. –

+0

어쩌면 제가 누락되었지만 원래 코드와의 차이점을 알 수 없습니다. 'return' 문은 다음'objectA'를 계속하는 대신에 find_whatever 메소드를 남겨 둡니다. – comecme

3

언어에 따라 일반적으로 끊기 레이블을 추가 할 수 있습니다. 나는 다음과 같은 그러나, 이러한 문제를 방지하고 좋을 것 :

function main() { 
    foreach (ObjectA a in listA) { 
     if (relationAB) { 
      processA(a) 
     } 
    } 
} 

function processA(ObjectA a) { 
    foreach (b) { 
     foreach (c) { 
      foreach (d) { 
       if (found) { 
        doSomething(); 
        return; 
       } 
      } 
     } 
    } 
} 

라벨 및 gotos 휴식이 코드를 읽기 어려울 수 있습니다. 함수로 분해하면 읽기 쉽고 쓰기 쉽고 디버그하기가 쉽습니다.

1

가장 간단한 옵션은 함수에 모두 넣고 break 문 대신 return 문을 사용하는 것입니다.

0

그런 경우에는 return을 사용하는 것이 더 좋습니다.

그냥 내부에 for 중 일부를 넣고 필요한 경우 다시 돌려 보내십시오. 루프 내에서 훨씬 더 읽기 쉬울 것입니다.

if (found) { 
break; 
} 

관련 문제