개요
C#에서 두 개의 리스트(List)를 비교하고, 그 차이에 해당하는 요소들만 모아 새로운 리스트를 만들어야 하는 경우가 종종 있습니다. 이럴 때 LINQ에서 제공하는 Except() 메서드를 활용하면 아주 간단하게 해결할 수 있습니다. 이번 글에서는 기본 예제부터 전체 실행 코드까지 단계별로 살펴보겠습니다.
1. 두 개의 리스트 준비하기
먼저 비교할 두 개의 문자열 리스트를 생성합니다.
첫 번째 리스트
List<string> list1 = new List<string>();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");위 리스트는 A, B, C, D 네 개의 요소를 가지고 있습니다.
두 번째 리스트
List<string> list2 = new List<string>();
list2.Add("C");
list2.Add("D");두 번째 리스트에는 C와 D만 포함되어 있습니다. 따라서 첫 번째 리스트에만 존재하는 요소는 A와 B입니다.
2. Except() 메서드로 차이점 찾기
두 리스트의 차이를 구할 때는 Except() 메서드를 사용합니다. 이 메서드는 첫 번째 컬렉션에는 있지만 두 번째 컬렉션에는 없는 요소들만 반환합니다.
IEnumerable<string> list3;
list3 = list1.Except(list2);
foreach (string value in list3) {
Console.WriteLine(value);
}실행 결과로 A와 B가 출력됩니다. 즉, list3에는 두 리스트의 차이에 해당하는 요소들이 담기게 됩니다.
참고: Except() 메서드는 중복된 값을 자동으로 제거하며, 기본 비교자(Default Comparer)를 사용해 요소를 비교합니다. 대소문자 구분 없이 비교하려면 StringComparer.OrdinalIgnoreCase 같은 사용자 지정 비교자를 인수로 전달할 수 있습니다.
3. 전체 예제 코드
지금까지의 내용을 하나로 합친 완전한 예제는 다음과 같습니다.
using System;
using System.Collections.Generic;
using System.Linq;
public class Demo {
public static void Main() {
// 첫 번째 리스트 생성
List<string> list1 = new List<string>();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");
Console.WriteLine("첫 번째 리스트...");
foreach (string value in list1) {
Console.WriteLine(value);
}
// 두 번째 리스트 생성
Console.WriteLine("두 번째 리스트...");
List<string> list2 = new List<string>();
list2.Add("C");
list2.Add("D");
foreach (string value in list2) {
Console.WriteLine(value);
}
// 두 리스트의 차이 계산
Console.WriteLine("두 리스트의 차이...");
IEnumerable<string> list3;
list3 = list1.Except(list2);
foreach (string value in list3) {
Console.WriteLine(value);
}
}
}실행 결과
첫 번째 리스트... A B C D 두 번째 리스트... C D 두 리스트의 차이... A B
마무리
이처럼 C#의 LINQ Except() 메서드를 사용하면 복잡한 반복문 없이도 두 리스트 간의 차이를 손쉽게 구해 새로운 컬렉션에 담을 수 있습니다. 교집합을 구하고 싶다면 Intersect(), 합집합이 필요하다면 Union() 메서드를 함께 활용해 보시기 바랍니다.