2010-03-26 2 views
25

나는 단순히 INT의 순서에서 모든 3S를 제거하려면 다음 코드의 결과를 찾을 조금 놀랐어요 :LINQ - 건너 뛰시겠습니까?

var sequence = new [] { 1, 1, 2, 3 }; 
var result = sequence.SkipWhile(i => i == 3); // Oh noes! Returns { 1, 1, 2, 3 } 

왜 3가 생략되지 않는 이유는 무엇입니까?

나의 다음 생각은 OK, 연산자를 제외하고는 트릭을 할 것이었다 : 요약

var sequence = new [] { 1, 1, 2, 3 }; 
var result = sequence.Except(i => i == 3); // Oh noes! Returns { 1, 2 } 

, 3 제거를 제외하고

  • 을뿐만 아니라 가 아닌 별개의 요소를 제거합니다. Grr.
  • 조건과 일치하는 경우에도 SkipWhile은 마지막 요소를 건너 뜁니다. Grr.

SkipWhile이 마지막 요소를 건너 뛰지 않는 이유를 설명 할 수 있습니까? 그리고 누구든지 위의 시퀀스에서 '3'을 제거하는 데 사용할 수있는 LINQ 연산자를 제안 할 수 있습니까?

+0

SkipWhile (true)로 생각하십시오. 그래서, 첫 번째 조건 (i == 3)이 실패합니다. 그래서 SkipWhile (false)가되어 다음에 어떻게 될까요? 그것은 남은 모든 요소를 ​​반환합니다! –

답변

51

깨지지 않았습니다. SkipWhileIEnumerable<T>의 시작 부분에있는 항목 만 건너 뜁니다. 그 조건이 충족되지 않으면 행복하게 나머지 요소를 취할 것입니다. 나중에 도로와 일치하는 다른 요소는 건너 뛰지 않습니다. 여기

int[] sequence = { 3, 3, 1, 1, 2, 3 }; 
var result = sequence.SkipWhile(i => i == 3); 
// Result: 1, 1, 2, 3 
+0

아, 이제 알겠습니다. 고마워요, 아마드. –

+7

MSDN 설명서에서 지정하지 않았기 때문에 방금 화상을 입었습니다. 뭐라 구요? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.skipwhile(v=vs.90).aspx –

+6

@StanR. - 아마 당신은 더 조심스럽게 문서를 읽을 필요가 있을까요? "지정된 조건이 true 인 경우 시퀀스에서 요소를 바이 패스 * *** *** 나머지 요소를 반환 ***" – JDB

17
var result = sequence.Where(i => i != 3); 
+1

또는 TakeWhile (i => i! = 3) – Nagg

+9

@Nagg'TakeWhile'은'{3,1,2,3} '와 같이 3으로 시작하는 시퀀스에는 아무 것도 반환하지 않습니다. 원하는 결과는 모든 3을 걸러내는 것인데, 이것은'Where'가있는 것입니다. –

+0

어, 와우, 금요일 괜찮아. 물론 운영자는 트릭을 수행 할 것입니다. [duh]. 그래도 SkipWhile이 예상대로 작동하지 않는 이유는 아닙니다. –

1
아마드 이미 질문에 대답

하지만, 다른 옵션들 :

var result = from i in sequence where i != 3 select i; 
2

SkipWhile 및 TakeWhile 운영자가 건너 뛰거나 술어 기능 (True를 반환)를 통과하는 동안 시퀀스에서 요소를 반환합니다. 술어 기능을 전달하지 J는 첫 x 째 요소는 평가 프로세스를 종료합니다.

// 지정된 조건이 참인 경우 시퀀스에서 요소를 바이 패싱하고 나머지 요소를 반환합니다.

2

"FindAll"List 기능을 사용하면 유용한 해결책이 될 수 있습니다.

List <int> aggregator = new List<int> { 1, 2, 3, 3, 3, 4 }; 
List<int> result = aggregator.FindAll(b => b != 3); 
관련 문제