C#의 LINQ에서 제공하는 Intersect() 메서드를 사용하면 두 배열 또는 컬렉션에 공통으로 존재하는 요소, 즉 교집합을 아주 간단하게 구할 수 있습니다.
먼저 예제로 사용할 두 개의 정수형 배열은 다음과 같습니다.
int[] val1 = { 15, 20, 40, 60, 75, 90 };
int[] val2 = { 17, 25, 35, 55, 75, 90 };이 두 배열의 교집합을 구하려면 AsQueryable() 메서드로 쿼리 가능한 형태로 변환한 뒤 Intersect() 메서드를 호출하면 됩니다.
val1.AsQueryable().Intersect(val2);
Intersect() 메서드는 두 시퀀스에 모두 포함된 고유한(distinct) 요소만 반환합니다. 즉, 한쪽에만 존재하는 값은 결과에서 제외되며, 중복된 값 역시 한 번만 나타납니다.
전체 예제 코드
using System;
using System.Collections.Generic;
using System.Linq;
class Demo {
static void Main() {
int[] val1 = { 15, 20, 40, 60, 75, 90 };
int[] val2 = { 17, 25, 35, 55, 75, 90 };
IEnumerable<int> res = val1.AsQueryable().Intersect(val2);
Console.WriteLine("Intersection of both the lists...");
foreach (int a in res)
Console.WriteLine(a);
}
}실행 결과
Intersection of both the lists... 75 90
실행 결과를 보면 75와 90, 단 두 개의 값만 출력된 것을 확인할 수 있습니다. 이 값들이 바로 두 배열에 동시에 존재하는 공통 요소, 즉 교집합입니다. 나머지 숫자들은 어느 한쪽 배열에만 있기 때문에 결과에서 제외되었습니다.
알아두면 좋은 점
- Intersect()는 기본 비교자(default comparer)를 사용하여 요소를 비교하므로, 문자열 컬렉션에서는 대소문자가 구분됩니다.
- 이 메서드는 지연 실행(deferred execution) 방식으로 동작하므로, 실제로 결과를 열거하는 시점(foreach 루프 등)에 연산이 수행됩니다.
- 사용자 지정 비교 로직이 필요하다면 IEqualityComparer<T>를 인자로 전달하는 오버로드를 활용할 수 있습니다.