C#에서 두 리스트(List)의 교집합, 즉 공통 요소를 찾고 싶다면 Intersect() 메서드를 사용하는 것이 가장 간단하고 효율적인 방법입니다. Intersect()는 LINQ에서 제공하는 집합 연산 메서드로, 두 컬렉션에 모두 존재하는 요소만 추출해 줍니다.
예제 리스트 살펴보기
먼저 교집합을 구할 두 개의 정수형 리스트를 만들어 보겠습니다.
첫 번째 리스트
List<int> list1 = new List<int>(); list1.Add(2); list1.Add(3); list1.Add(5); list1.Add(7);
두 번째 리스트
List<int> list2 = new List<int>(); list2.Add(5); list2.Add(4); list2.Add(6); list2.Add(8);
위 두 리스트를 비교하면, 양쪽에 모두 포함된 값은 5 하나뿐입니다. 따라서 교집합 결과는 5가 되어야 합니다.
전체 예제 코드
아래는 Intersect() 메서드를 활용해 두 리스트의 교집합을 구하고, 그 개수를 출력하는 전체 C# 프로그램입니다.
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo {
public class Program {
public static void Main(String[] args) {
// 첫 번째 리스트 생성
List<int> list1 = new List<int>();
list1.Add(2);
list1.Add(3);
list1.Add(5);
list1.Add(7);
Console.WriteLine(list1.Count);
// 두 번째 리스트 생성
List<int> list2 = new List<int>();
list2.Add(5);
list2.Add(4);
list2.Add(6);
list2.Add(8);
Console.WriteLine(list2.Count);
// 두 리스트의 교집합 구하기
List<int> common = list1.Intersect(list2).ToList();
Console.WriteLine(common.Count);
}
}
}실행 결과
4 4 1
결과 분석
출력 결과를 순서대로 해석하면 다음과 같습니다.
- 4 – 첫 번째 리스트(list1)의 요소 개수
- 4 – 두 번째 리스트(list2)의 요소 개수
- 1 – 교집합(common)의 요소 개수, 즉 두 리스트에 공통으로 존재하는 값은 5 하나뿐입니다.
Intersect() 메서드의 특징
Intersect() 메서드를 사용할 때 몇 가지 알아두면 좋은 점이 있습니다.
- LINQ 네임스페이스 필요: Intersect()는 System.Linq 네임스페이스에 정의된 확장 메서드이므로 반드시
using System.Linq;를 추가해야 합니다. - 중복 제거: 교집합 결과에는 중복 값이 자동으로 제거되어 고유한(unique) 요소만 반환됩니다.
- 지연 실행(Lazy Evaluation): Intersect() 자체는 즉시 실행되지 않으며, ToList()나 foreach와 같은 열거 작업이 수행될 때 실제로 계산됩니다.
- 기본 비교 방식: 기본적으로 해당 타입의 기본 같음 비교자(EqualityComparer)를 사용하며, 필요하다면 사용자 지정 비교자를 인자로 전달할 수도 있습니다.
이처럼 Intersect() 메서드를 활용하면 복잡한 반복문 없이 단 한 줄의 코드로 두 리스트의 교집합을 손쉽게 구할 수 있습니다.