2010-02-26 2 views
57

중첩 루프가 있고 동시에 모든 루프에서 손을 뗄까요?C#에서 여러 루프를 한꺼번에 처리하는 방법은 무엇입니까?

while (true) { 
    // ... 
    while (shouldCont) { 
     // ... 
     while (shouldGo) { 
      // ... 
      if (timeToStop) { 
       break; // Break out of everything? 
      } 
     } 
    } 
} 

PHP에서 break은 벗어날 루프 수에 대한 인수를 취합니다. 이 같은 것을 C#에서 할 수 있습니까?

goto과 같이 끔찍한 무엇인가?

// In the innermost loop 
goto BREAK 
// ... 
BREAK: break; break; break; 
+0

goto의 구문이 잘못되었습니다. 루프 바깥에 라벨을 붙여 놓고 아무 곳에 나 두지 마십시오. – Jimmy

+1

중복 됨 : http://stackoverflow.com/questions/1586932/what-is-a-neat-way-of-breaking-out-of-many-for-loops-at-once – Foole

+1

고려 : http : // blogs .msdn.com/ericlippert/archive/2010/01/11/continuing-to-an-outer-loop.aspx –

답변

73

함수로 중첩 된 루프를 추출하고 당신은 오히려 휴식보다, 어디에서 루프에서 얻을 수익을 사용할 수 있습니다.

+15

그 기능은 무엇을위한 것이 아닌 해킹입니다. goto를 싫어하는 대부분의 사람들은 기능상의 초기 수익을 나쁜 것으로 간주합니다. 그런 광범위한 의견에 동의하지 않지만 goto를 사용하는 것이 문제에 대한이 솔루션만큼 효과적이라고 말할 수 있습니다. – matt

+20

전적으로 매트에 동의하지 않습니다. 기능을 한 번만 종료해야한다고 생각하는 사람의 수는 gotos를 싫어하는 사람보다 훨씬 적습니다. 그 이유는 많은 언어에서 goto가 올바른 리소스 정리를 수행하지 못하기 때문입니다 (확실히 C#은 알지 못합니다).하지만 반환은 않습니다. 또한 IMHO 함수는 관련 코드를 그룹화, 범위 지정 및 단순화하기위한 것입니다. 이것이 바로 이것이하는 일입니다. –

+0

나는이 대답에 동의한다. 중첩 루프를 별도의 함수에 넣는 한 가지 이유는 원래 함수가 너무 커지게된다는 것입니다. 원래 함수가 이렇게 큰 경우 중첩 루프는 함수를 두 개의 함수로 나눌 수있는 좋은 장소입니다. 일련의 중첩 된 루프 인 작업 A가 있고 루프가 찾고있는 것을 찾은 후에 작업 B로 이동하려고합니다.여러 번의 반품이 문제라고 생각하면 기능이 너무 큽니다. –

21

악용 될 때만 고토가됩니다. 일부 중첩의 가장 안쪽 루프에서 빠져 나오려면 괜찮습니다. 하지만 ... 왜 처음에는 거기에 너무 많은 중첩이 있는지 물어야합니다.

짧은 답변 : 제

+12

+1. 기본적으로, 모든 제어 구조는 밑에있는 'goto'입니다. 그냥 특정 목적에 맞게. 특별한 목적으로 다루지 않는 모든 것에 대해서는'goto'보다 다른 "우아한"옵션이 없습니다. – Joey

+1

IMO GOTO는 어셈블리 프로그래밍 외부에서 사용할 때만 무시 무시합니다. 각각 자신에게 : – Pwninstein

+0

구조화 된 프로그래밍 관점에서 goto는 선택 및 반복의 상위 레벨 구조가 구현 된 저급 구조입니다. 구조화 된 프로그래밍 모듈을 반환, 중단 및 계속 중단하는 것은 사실상 goto의 특수한 경우이지만, 그럼에도 불구하고 나는 그 유용성이 그날 승리하는 경향이 있다고 생각합니다. – Stewart

54

다른 제어 플래그를 도입하고 아래의 모든 중첩 된 조건에 넣으십시오. 또한 가지고있는 while (true) 상태를 대체합니다.

bool keepLooping = true; 
while (keepLooping) { 
    // ... 
    while (shouldCont && keepLooping) { 
     // ... 
     while (shouldGo && keepLooping) { 
      // ... 
      if (timeToStop) { 
       keepLooping = false; 
       break; // break out of everything? 
      } 
     } 
    } 
} 
+2

+1 매우 좋습니다! :) 이와 비슷한 것을 게시했지만 귀하의 것이 더 좋았 기 때문에 삭제했습니다. – Pwninstein

+0

두 번 이상 투표 할 수 있기를 바랍니다. 'if (timeToStop & keepLooping)'은 아마도 'keepLooping'부분을 잃어 버릴 수 있습니다. – Pwninstein

+1

나는 그것을 얻지 못한다. 어떻게 이것을 goto보다 쉽게 ​​읽을 수 있는가? 모든 루프에서 빠져 나오기위한 의도를 설명하는 변수 이름을 제시해야합니다. 왜 고토 라벨의 이름을 붙이기 위해 동일한 노력을 기울여야합니까? 이 모든 것이 천천히 진행됩니다. 하나의 라벨뿐만 아니라 keepLooking이 사용되는 모든 곳을 찾아야합니다. – matt

2

전체 방법에서 벗어나려면 아래 코드를 사용하십시오. 메서드에서 벗어나지 않고 메서드 내에서 일련의 루프 만 중단하려는 경우 이미 게시 된 답변 중 하나가 작업을 수행합니다.

if (TimeToStop) 
{ 
    return; 
}