2009-03-17 11 views
247

Perl에서는 next; 명령으로 foreach (또는 임의의 루프) 반복을 건너 뛸 수 있습니다.`foreach` 루프의 반복을 건너 뛰는 방법은 무엇입니까?

반복을 건너 뛰고 C#의 다음 루프로 건너 뛰는 방법이 있습니까?

foreach (int number in numbers) 
{ 
    if (number < 0) 
    { 
     // What goes here to skip over the loop? 
    } 

    // otherwise process number 
} 
+0

잘못된 입력을 사용자에게 알리는 것은 건너 뛰는 것만 큼 중요합니다! – usefulBee

답변

514

당신이 원하는 :

foreach (int number in numbers) // <--- go back to here --------+ 
{        //        | 
    if (number < 0)    //        | 
    {       //        | 
     continue; // Skip the remainder of this iteration. -----+ 
    } 

    // do work 
} 

가 여기에 continue keyword에 대한 자세한 내용입니다.


는 업데이트 : 코멘트에 브라이언의 후속 질문에 대한 응답으로 :

당신이 더 내가 루프 중첩 더라면 내가 어떻게 할 것인지 명확히하고, 수는 반복을 건너 뛸 원 확장 된 것들 중 하나? 당신은 가장 바깥 쪽 루프의 탈옥을 사용할 수 있도록

for (int[] numbers in numberarrays) { 
    for (int number in numbers) { // What to do if I want to 
           // jump the (numbers/numberarrays)? 
    } 
} 

continue는 항상 가장 가까운 둘러싸고있는 범위에 적용됩니다. 그런 상황이 발생하면 내부 루프의 break, 바깥 루프의 continue과 같이 원하는 것을 선택하면 더 복잡한 작업을 수행해야합니다. break keyword에 대한 설명서는 여기를 참조하십시오. break C# 키워드는 Perl last 키워드와 유사합니다.

또한, 사전에 처리하지 않으려는 단지 값을 필터링하는 더스틴의 제안을 복용 고려 :

foreach (var basket in baskets.Where(b => b.IsOpen())) { 
    foreach (var fruit in basket.Where(f => f.IsTasty())) { 
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue 
          // since all the fruits that reach this point are 
          // in available baskets and tasty. 
    } 
} 
+0

루프에 중첩되어 확장 된 루프 중 하나의 반복을 건너 뛰고 싶다면 내가 무엇을 할 것인지 명확히 할 수 있습니까? 예 : (numberarrays에서 INT [] 숫자)에 대한 {(숫자 INT 번호)에 대한 { // } 제 (번호/numberarrays)을 이동하려는 경우 수행 할 작업} – Brian

+0

C#의'goto'을 브라이언이 묻는 상황에 실제로 유용합니다. 바깥 쪽 루프의 맨 아래에'nextArray :'와 같은 레이블을 추가하고, 건너 뛸 때'goto nextArray;'를 추가하십시오. –

17
foreach (int number in numbers) 
{ 
    if (number < 0) 
    { 
     continue; 
    } 

    //otherwise process number 
} 
7

사용이 문을 계속 :

foreach(object o in mycollection) { 
    if(number < 0) { 
     continue; 
    } 
    } 
+3

"upvoted 이유를 이해하지 못합니다."number "가 아닌"o "를 반복하기 때문에 이것은 잘못된 것입니다. – Fortune

+0

동의 함, 이전 답변의 복사/붙여 넣기입니까? 개념적으로 가치있는 것은 foreach이지만 변수가 일관성이 있는지 확인하십시오. –

12

당신은 continue 문을 사용할 수 있습니다. 예를 들어

:

foreach(int number in numbers) 
{ 
    if(number < 0) 
    { 
     continue; 
    } 
} 
23

는 또한 플립 수 귀하의 경우 시험 :


foreach (int number in numbers) 
{ 
    if (number >= 0) 
    { 
     //process number 
    } 
} 
+0

:) 감사합니다! 루프의 시작 부분에는 처리 할 필요가없는 몇 가지 기준과 잡힐 필요가있는 오류가있는 기본 예제가 있기 때문에 기본적인 예제를 제시합니다. – Brian

+0

+1을 계속 사용하지 않는 경우 – Trap

+4

더 많은 ifs를 사용하지 마십시오. ( – Custodio

43

또 다른 방법은 루프가 실행되기 전에 LINQ를 사용하여 필터링 할 수 있습니다 :

foreach (int number in numbers.Where(n => n >= 0)) 
{ 
    // process number 
} 
+2

+1이됩니다. 질문에 대한 직접적인 대답은 실제로 내가 제안한 것에 대한이 해결책을 선호 할 것입니다 .LINQ를 사용하는 것은 처리하고 싶지 않은 루프 값을 필터링하는 좋은 일반적인 사용법처럼 보입니다. –

+3

이 방법은 조금 깔끔한 것입니까? 실제로 foreach에 덜 빠를 것인가? 나는 LINQ가 크게 최적화되어 있다고 생각하지만, LINQ 섹션은 데이터 세트가 크고 그 결과 '필터링 된'하위 집합이 거의 이론적으로 어떤 지점에서 foreach해야합니다. 큰 경우, foreach가 두 번 발생해야하므로 느려질 것입니다. 그래서 예상되는 결과 하위 데이터 세트에 따라 다를 수 있습니다. – Coops

12

또 다른 방법을 linq 사용 :

foreach (int number in numbers.Skip(1)) 
{ 
    // process number 
} 

여러 항목에서 첫 번째를 건너 뛰려면.

건너 뛰기 조건을 지정하려면 .SkipWhere을 사용하십시오.

관련 문제