C#에서 HashSet과 지정된 컬렉션 사이에 공통 요소가 하나라도 존재하는지 확인하려면 Overlaps() 메서드를 사용합니다. 이 메서드는 두 집합이 최소한 하나 이상의 동일한 요소를 공유하고 있으면 true를, 그렇지 않으면 false를 반환합니다.
Overlaps() 메서드란?
HashSet<T>.Overlaps(IEnumerable<T> other) 메서드는 현재 HashSet 객체와 매개변수로 전달된 컬렉션 사이에 교집합이 존재하는지 판별합니다. 전체 교집합을 계산하지 않고 공통 요소 발견 즉시 결과를 반환하므로 성능 면에서도 효율적입니다.
예제 1: 정수형 HashSet 비교
다음 예제에서는 두 개의 정수형 HashSet을 만들고 서로 공통 요소를 가지고 있는지 확인합니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
HashSet<int> set1 = new HashSet<int>();
set1.Add(25);
set1.Add(50);
set1.Add(75);
set1.Add(100);
set1.Add(125);
set1.Add(150);
Console.WriteLine("HashSet1의 요소");
foreach(int val in set1){
Console.WriteLine(val);
}
HashSet<int> set2 = new HashSet<int>();
set2.Add(30);
set2.Add(60);
set2.Add(100);
set2.Add(150);
set2.Add(200);
set2.Add(250);
Console.WriteLine("HashSet2의 요소");
foreach(int val in set2){
Console.WriteLine(val);
}
Console.WriteLine("공통 요소가 존재합니까? " + set1.Overlaps(set2));
}
}실행 결과
HashSet1의 요소 25 50 75 100 125 150 HashSet2의 요소 30 60 100 150 200 250 공통 요소가 존재합니까? True
위 결과에서 볼 수 있듯이 두 HashSet은 100과 150이라는 공통 요소를 가지고 있으므로 Overlaps() 메서드는 True를 반환합니다.
예제 2: 문자열 HashSet 비교
이번에는 문자열 타입의 HashSet 두 개를 비교해 보겠습니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
HashSet<String> set1 = new HashSet<String>();
set1.Add("Nathan");
set1.Add("Tim");
set1.Add("Tom");
set1.Add("Jack");
set1.Add("Steve");
set1.Add("David");
Console.WriteLine("HashSet1의 요소");
foreach(string val in set1){
Console.WriteLine(val);
}
HashSet<String> set2 = new HashSet<String>();
set2.Add("Tom");
set2.Add("Jack");
set2.Add("Kevin");
Console.WriteLine("HashSet2의 요소");
foreach(string val in set2){
Console.WriteLine(val);
}
Console.WriteLine("공통 요소가 존재합니까? " + set1.Overlaps(set2));
}
}실행 결과
HashSet1의 요소 Nathan Tim Tom Jack Steve David HashSet2의 요소 Tom Jack Kevin 공통 요소가 존재합니까? True
두 번째 예제에서도 Tom과 Jack이라는 공통 요소가 존재하기 때문에 결과는 True입니다.
정리
C#에서 HashSet과 다른 컬렉션 간의 공통 요소 존재 여부를 확인할 때는 Overlaps() 메서드가 가장 간단하고 효율적인 방법입니다. 불리언 값만 필요한 상황에서 교집합을 직접 구현하는 것보다 코드가 훨씬 간결해지며, 내부적으로 조기 종료(early exit) 방식으로 동작하여 대용량 데이터에서도 빠른 성능을 보장합니다.