2012-05-11 3 views
0

컬렉션의 일부를 다른 컬렉션으로 추출하려고합니다. 쉽게 for 루프를 사용하여 동일한 작업을 수행 할 수 있지만 linq 쿼리가 동일하게 작동하지 않습니다. testColl1가 testColl2 소스 &입니다Linq 쿼리를 사용하여 컬렉션 자르기

Collection<string> testColl1 = new Collection<string> {"t1", "t2", "t3", "t4"}; 
Collection<string> testColl2 = new Collection<string>(); 

for (int i = 0; i < newLength; i++) 
{ 
    testColl2.Add(testColl1[i]); 
} 

가 있습니다 : 그래서 나에게 질의를하는

기존 방법 (/ 초보자 튜토리얼 링크 설명과 함께 가능한 경우) 수정 도와주세요, Linq에있는 초신자입니다 count = newLength의 원하는 잘린 콜렉션.

나는 다음과 같은 LINQ 쿼리를 사용했지만, 그들 중 누구도 작동하지 않습니다 ...

var result = from t in testColl1 where t.Count() <= newLength select t; 
      var res = testColl1.Where(t => t.Count() <= newLength); 

답변

3

사용 Enumerable.Take을 :

당신의 for 루프 Take를 사용하여 버전 사이의 의미 적 차이가 있음을
var testColl2 = testColl1.Take(newLength).ToList(); 

참고. for 루프는 testColl1newLength 개 항목 미만인 경우 IndexOutOfRangeException 예외로 발생하지만 Take 버전은 자동으로이 사실을 무시하고 단지 newLength 개 항목까지 반환합니다.

+0

예, U는 정확합니다. 실수로 +1을 사용 했으므로 편집되었습니다. Thx – Biki

+0

@Biki : 귀하의 수정 내용을 반영하여 답변을 편집했습니다. – jason

+0

끝에 ToTo() 또는 .ToArray()를 추가하면 IEnumerable을 컬렉션으로 변환하는 데 도움이되지 않습니다. testColl2 = (Collection )와 같이 사용하는 것이 좋습니다. testColl1.Take (newLength); – Biki

2

올바른 방법은 Take을 사용하는 것입니다 :

var result = testColl1.Take(newLength); 

Where를 사용하는 동등한 방법입니다

:

var result = testColl1.Where((i, item) => i < newLength); 

이 표현식은 IEnumerable이므로 마지막에 .ToList() 또는 .ToArray()을 첨부 할 수도 있습니다.

두 가지 방법 모두 더 자연 스럽기 때문에 (예 : newLength == 0 반환 할 상품이없는 경우) 원래 구현보다 적은 항목을 반환합니다.

+0

감사와 & +1에 해당하는 곳입니다. where 절도 설명 할 수 있다면 좋을 것입니다. – Biki

1

당신은 이런 식으로 for 루프로 변환 할 수 있습니다 :

testColl1.Take(newLength) 
1

사용 Take :

var result = testColl1.Take(newLength); 

이 확장 방법은 N이 경우 newLength, 당신은 전달하는 매개 변수 컬렉션에서 첫 번째 N 요소를 반환합니다.