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님의 주말특강입니다
by 피요히코~ 2009. 4. 26. 20:16
| 1 |