LINQ to Object 마지막입니다.
(사실 내용이 Object에만 해당되는건 아니죠.. -ㅁ-;;)
이번엔 Take와 Skip,그리고 TakeWhile, SkipWhile에 대해볼께요.
예제는 너무나도 간단하네요.
int[] nums = { 10, 9, 8, 7, 5, 6, 4, 3, 2, 1 };
var r01 = nums.Take(3);
var r02 = nums.Skip(3);
var r03 = nums.TakeWhile(x => x > 5);
var r04 = nums.SkipWhile(x => x > 5);
간단하지만 (저는)헷깔릴수 있으니 잘 봐야 합니다. ㅋ
일단 nums를 보면 숫자 순서가 7,6,5 가 아니라 7,5,6 입니다.
첫번째로 Take(3)을 하면 그냥 앞에서 3개만 가져옵니다.
두번째로 Skip(3)을 하면 반대로 뒤에서 3개만 가져오죠
While이 좀 헷깔리는데요
r03에서 TakeWhile(x => x > 5)를 하면
x가 5보가 큰 녀석들을 가져오는건데.
이게 (루프를 돌겠죠?) 5보다 큰녀석을 다 가져오는게 아닙니다.
10,9,8,~~ 돌면서 5보다 큰 녀석을 찾는데
보면..
7 까지는 5보다 크지만 그 다음에 5는 5보다 크지 않죠.
그럼 거기서 끝납니다.
그 다음에 6이라는 숫자가 5보다 크지만.
신경 안써요.
그냥 끝나버리는거에요.
SkipWhile도 비슷해요.
5보다 크면 skip해버리는데
10~7까지 스킵하고. 5부터 출력을 하는데. 그 다음수인 6이 5보다 큰거 따위 신경 안쓰죠.
그럼 이번에는
Non-Generic 타입을 사용하는걸 봐볼께요.
Non-Generic 타입은 바로 사용은 못합니다.
코드를 보면
일단 ArrayList를 선언하고 값을 몇개 넣습니다.
ArrayList src = new ArrayList();
for (int i = 0; i < 10; i++)
{
src.Add(i + 1);
}
그 다음에
var r01 = from x in src
where x > 3
select x;
이렇게 해주면 바로 오류가 납니다.
오류 내용은
소스형식 'System.Collections.ArrayList'에 대해 구현된 쿼리 패턴을 찾을 수 없습니다.
'Where'을(를) 찾지 못했습니다. 범위 변수 'x'의 형식을 명시적으로 지정하십시오.
라고 나오네요
ArrayList를 사용하고 싶으면
casting을 해줘야 해요
var r01 = from x in src.Cast()
where x > 3
select x;
요렇게요.
그럼 결과값이 잘 나옵니다.
출처?는 김수영MVP님의 주말특강입니다
RECENT COMMENT