C#에서는 Except() 메서드를 사용하여 두 배열 또는 컬렉션 간의 차이, 즉 첫 번째 컬렉션에는 있지만 두 번째 컬렉션에는 없는 요소들을 손쉽게 구할 수 있습니다.
Except() 메서드란?
Except()는 System.Linq 네임스페이스에 포함된 집합 연산자 중 하나로, 첫 번째 시퀀스에서 두 번째 시퀀스에 포함된 요소들을 제외한 나머지 요소들을 반환합니다. 기본 비교자(Default Comparer)를 사용하며, 결과에는 중복된 요소가 제거된 상태로 반환됩니다.
예제 배열 살펴보기
다음과 같은 두 개의 정수형 배열이 있다고 가정해 보겠습니다.
int[] arr = { 9, 12, 15, 20, 35, 40, 55, 67, 88, 92 };
int[] arr2 = { 20, 35 };arr2에 포함된 요소(20, 35)를 arr에서 제외한 결과를 얻으려면 Except() 메서드를 다음과 같이 호출하면 됩니다. 이 메서드는 두 번째 목록에 있는 요소들을 제외한 첫 번째 목록을 반환합니다.
arr.AsQueryable().Except(arr2);
전체 예제 코드
using System;
using System.Linq;
using System.Collections.Generic;
class Program {
static void Main() {
int[] arr = { 5, 10, 15, 20, 35, 40 };
int[] except = { 20, 35 };
Console.WriteLine("초기 리스트...");
foreach(int ele in arr)
Console.WriteLine(ele);
IEnumerable<int> res = arr.AsQueryable().Except(except);
Console.WriteLine("새 리스트...");
foreach (int a in res)
Console.WriteLine(a);
}
}
실행 결과
초기 리스트...
5
10
15
20
35
40
새 리스트...
5
10
15
40
참고 사항
Except()는 지연 실행(lazy evaluation) 방식으로 동작하므로, foreach 루프 등을 통해 실제로 열거할 때 쿼리가 실행됩니다. 또한 두 컬렉션의 요소가 사용자 정의 타입이라면 IEquatable<T> 인터페이스를 구현하거나 IEqualityComparer를 별도로 지정해야 올바르게 비교됩니다. 참고로 AsQueryable()은 시퀀스를 IQueryable 형태로 변환하는 역할만 하며, LINQ to Objects 환경에서는 생략해도 동일하게 동작합니다.