C#에서 SortedSet과 다른 컬렉션 간의 교집합을 구하려면 IntersectWith() 메서드를 사용합니다. 이 메서드는 현재 SortedSet 객체를 수정하여, 두 집합에 공통으로 존재하는 요소만 남깁니다.
IntersectWith() 메서드란?
IntersectWith(IEnumerable<T> other)는 매개변수로 전달된 컬렉션과 현재 집합을 비교한 뒤, 양쪽 모두에 있는 요소만 현재 집합에 유지합니다. SortedSet은 항상 정렬된 상태와 중복 없음을 보장하기 때문에, 연산 결과 역시 오름차순으로 정렬되어 반환됩니다.
예제 1: 정수형 SortedSet의 교집합
두 개의 정수형 SortedSet을 만들고 교집합을 구하는 코드입니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
SortedSet<int> set1 = new SortedSet<int>();
set1.Add(100);
set1.Add(200);
set1.Add(300);
SortedSet<int> set2 = new SortedSet<int>();
set2.Add(450);
set2.Add(200);
set2.Add(650);
set2.Add(300);
set2.Add(800);
Console.WriteLine("두 집합이 같은가? = " + set1.SetEquals(set2));
set1.IntersectWith(set2);
Console.WriteLine("결과 SortedSet...");
foreach(int val in set1){
Console.WriteLine(val);
}
}
}실행 결과
두 집합이 같은가? = False 결과 SortedSet... 200 300
위 예제에서 set1에는 {100, 200, 300}, set2에는 {200, 300, 450, 650, 800}이 저장되어 있습니다. 두 집합은 서로 다르므로 SetEquals()는 False를 반환하고, 교집합 연산 후에는 공통 요소인 200과 300만 남게 됩니다.
예제 2: 문자열 SortedSet과 열거자(Enumerator) 활용
이번에는 문자열 타입의 SortedSet 두 개를 사용하고, GetEnumerator()로 열거자를 직접 순회하는 예제입니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
SortedSet<string> set1 = new SortedSet<string>();
set1.Add("AB");
set1.Add("BC");
set1.Add("CD");
set1.Add("EF");
set1.Add("PQ");
set1.Add("ST");
Console.WriteLine("SortedSet1의 요소...");
foreach (string res in set1){
Console.WriteLine(res);
}
Console.WriteLine("SortedSet1의 요소 개수 = " + set1.Count);
SortedSet<string> set2 = new SortedSet<string>();
set2.Add("BC");
set2.Add("CD");
set2.Add("DE");
set2.Add("EF");
set2.Add("AB");
set2.Add("HI");
set2.Add("JK");
Console.WriteLine("SortedSet2의 요소(Enumerator 사용)...");
SortedSet<string>.Enumerator demoEnum = set2.GetEnumerator();
while (demoEnum.MoveNext()) {
string res = demoEnum.Current;
Console.WriteLine(res);
}
Console.WriteLine("SortedSet2의 요소 개수 = " + set2.Count);
set1.IntersectWith(set2);
Console.WriteLine("결과 SortedSet...");
foreach(string val in set1){
Console.WriteLine(val);
}
}
}실행 결과
SortedSet1의 요소... AB BC CD EF PQ ST SortedSet1의 요소 개수 = 6 SortedSet2의 요소(Enumerator 사용)... AB BC CD DE EF HI JK SortedSet2의 요소 개수 = 7 결과 SortedSet... AB BC CD EF
첫 번째 집합은 6개, 두 번째 집합은 7개의 문자열을 가지고 있으며, 교집합 연산 결과 공통 요소인 AB, BC, CD, EF 네 개만 결과 SortedSet에 남습니다.
정리
IntersectWith()메서드는 현재 SortedSet을 수정하여 두 컬렉션의 공통 요소만 남깁니다.SetEquals()메서드는 두 집합이 동일한 요소를 가지는지 여부를 bool 값으로 반환합니다.- SortedSet은 자동으로 정렬 및 중복 제거를 수행하므로, 교집합 결과도 항상 정렬된 상태로 유지됩니다.
GetEnumerator()를 사용하면 foreach 문 없이도 열거자를 통해 집합의 요소를 순회할 수 있습니다.