소년포비의 세계정복!!

[스크랩] LINQ 로 LIST 제네릭과 DICTIONARY 로 차집합 구해보기 본문

프로그램 세상/C#

[스크랩] LINQ 로 LIST 제네릭과 DICTIONARY 로 차집합 구해보기

소년포비 2009. 10. 5. 20:25


MSDN 을 찾아보면 두개의 TXT 파일에 문자열이 다른 부분을 찾는 설명이 존재합니다.



자세히 내용을 살펴보면...


static void Main()
    {
        // Create the IEnumerable data sources.
        string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");
        string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");
        // Create the query. Note that method syntax must be used here.
        IEnumerable<string> differenceQuery =
          names1.Except(names2);
        // Execute the query.
        Console.WriteLine("The following lines are in names1.txt but not names2.txt");
        foreach (string s in differenceQuery)
            Console.WriteLine(s);
        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey(); 

}



LINQ를 사용하여 문자열의 두 목록을 비교하고 names1.txt에 있지만 names2.txt에는 없는 해당 줄을 출력하는 방법을 보여 줍니다.




이번에는 LIST 제네릭과 DICTIONARY 객체에서도 이런 차집합 데이터를 어떻게 추출하는지 확인해 보겠습니다.




static void Main(string[] args)
{
  List<string> names = new List<string>
  { "심재운", "이유진", "권판진", "이현수", "양경욱" };
 
  Dictionary<string, string> visiting = new Dictionary<string, string>()
  { { "심재운", "Turkey" }, { "이유진", "Germany" }, { "권판진", "Bangalore" } };
 
  var minus =
    from n in names
    let places = from p in visiting select p.Key
    where !places.Contains(n)
    select n;
 
  foreach (var v in minus)
    Console.WriteLine(v);
 
  Console.ReadKey();

}



where 절 - 이 조건에 맞는 항목만 출력한다

orderby 절 - 결과셋의 출력순서를 지정한다. 디폴트는 오름차순이고 내림차순을 원할?는 끝에 descending 붙여야 한다.

let 절 - 결과셋을 가공하여 임시변수에 저장하는 역할을 한다. 쿼리문 내에서 임시로 사용할 변수가 필요할때 let문으로 변수를 선언하고 이후 출력이나 조건, 점검 등에 이 변수를 활용할수 있다.




위의 결과값은 ...



이현수

양경욱




여기서 주목할 것은 SQL 의 IN 쿼리 처럼 LINQ 에는 Contains 함수를 이용하여 이를 포함하고 있지 않은 대상자를 minus 객체에

할당을 합니다.


그리고 출력은 간단히 foreach 구문을 이용해서 출력을 합니다.




=========== 참 고 =============



Figure A 연산자의 범주

연산자
설명
집계
 
Aggregate
시퀀스에 대해 사용자 지정 메서드 수행
Average
숫자 값 시퀀스의 평균 계산
Count
시퀀스에 있는 항목의 수를 int로 반환
LongCount
시퀀스에 있는 항목의 수를 long으로 반환
Min
숫자 시퀀스의 최소 숫자를 검색
Max
숫자 시퀀스의 최대 숫자를 검색
Sum
시퀀스의 수 합계 계산
연결
 
Concat
두 시퀀스를 하나의 시퀀스로 연결
변환
 
Cast
시퀀스의 요소를 지정한 형식으로 캐스트
OfType
시퀀스의 요소를 지정한 형식으로 필터링
ToArray
시퀀스에서 배열 반환
ToDictionary
시퀀스에서 사전 반환
ToList
시퀀스에서 목록 반환
ToLookup
시퀀스에서 조회 반환
ToSequence
IEnumerable 시퀀스 반환
요소
 
DefaultIfEmpty
빈 시퀀스에 대한 기본 요소 생성
ElementAt
시퀀스의 지정한 색인에서 요소 반환
ElementAtOrDefault
시퀀스의 지정한 색인에서 요소를 반환하거나 색인의 범위가 벗어난 경우 기본값 반환
First
시퀀스의 첫 번째 요소 반환
FirstOrDefault
시퀀스의 첫 번째 요소를 반환하거나 요소가 없는 경우 기본값 반환
Last
시퀀스의 마지막 요소 반환
LastOrDefault
시퀀스의 마지막 요소를 반환하거나 요소가 없는 경우 기본값 반환
Single
시퀀스의 단일 요소 반환
SingleOrDefault
시퀀스의 단일 요소를 반환하거나 요소가 없는 경우 기본값 반환
같은지 확인
 
SequenceEqual
두 시퀀스를 비교하여 동일한지 확인
생성
 
Empty
빈 시퀀스 생성
Range
지정한 범위의 시퀀스 생성
Repeat
지정한 횟수만큼 항목을 반복하여 시퀀스 생성
그룹화
 
GroupBy
지정한 그룹화로 시퀀스의 항목 그룹화
결합
 
GroupJoin
두 시퀀스에 대한 그룹 조인 수행
Join
두 시퀀스에 대한 내부 조인 수행
정렬
 
OrderBy
값의 오름차순에 따라 시퀀스 정렬
OrderByDescending
값의 내림차순에 따라 시퀀스 정렬
ThenBy
이미 정렬된 시퀀스를 오름차순에 따라 정렬
ThenByDescending
이미 정렬된 시퀀스를 내림차순에 따라 정렬
Reverse
시퀀스의 항목을 반대로 정렬
분할
 
Skip
지정 횟수만큼 항목을 건너뛴 시퀀스 반환
SkipWhile
식을 충족하지 못하는 항목을 건너뛴 시퀀스 반환
Take
지정 횟수만큼 항목을 포함하는 시퀀스 반환
TakeWhile
식을 충족하는 항목을 포함하는 시퀀스 반환
예측
 
Select
시퀀스의 일부를 예측
SelectMany
시퀀스의 일부에 대한 일대다 예측 생성
한정자
 
All
시퀀스의 모든 항목이 조건을 충족하는지 확인
Any
시퀀스에 조건을 충족하는 항목이 있는지 확인
Contains
시퀀스에 지정한 항목이 포함되어 있는지 확인
제한
 
Where
시퀀스의 항목을 필터링
집합
 
Distinct
중복 항목이 없는 시퀀스 반환
Except
두 시퀀스의 차집합을 나타내는 시퀀스 반환
Intersect
두 시퀀스의 교집합을 나타내는 시퀀스 반환
Union
두 시퀀스의 합집합을 나타내는 시퀀스 반환





감사합니다. posted by 심재운 (shimpark@gmail.com)



출처 : 닷넷 (.NET) 프로그래머 모임
글쓴이 : 심재운 원글보기
메모 :