C#의 SortedSet<T> 클래스는 항상 정렬된 상태를 유지하는 고유한 요소들의 컬렉션을 나타냅니다. 일반적인 HashSet과 달리 SortedSet은 내부적으로 이진 검색 트리 구조를 기반으로 하여, 요소를 추가하거나 제거할 때마다 자동으로 오름차순으로 정렬됩니다. 또한 중복 요소는 허용되지 않으며, 순회 시에는 항상 정렬된 순서로 요소에 접근할 수 있다는 점이 큰 장점입니다.
SortedSet 클래스의 주요 속성
SortedSet 클래스에서 자주 사용되는 주요 속성은 다음과 같습니다.
| 번호 | 속성 및 설명 |
|---|---|
| 1 | Comparer SortedSet<T>의 값을 정렬하는 데 사용되는 IComparer<T> 개체를 가져옵니다. |
| 2 | Count SortedSet<T>에 포함된 요소의 개수를 가져옵니다. |
| 3 | Max 비교자(comparer) 기준으로 SortedSet<T>에서 가장 큰 값을 가져옵니다. |
| 4 | Min 비교자(comparer) 기준으로 SortedSet<T>에서 가장 작은 값을 가져옵니다. |
SortedSet 클래스의 주요 메서드
SortedSet 클래스에서 제공하는 대표적인 메서드는 다음과 같습니다.
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | Add(T) 집합에 요소를 추가하고, 추가 성공 여부를 나타내는 bool 값을 반환합니다. |
| 2 | Clear() 집합에서 모든 요소를 제거합니다. |
| 3 | Contains(T) 집합에 특정 요소가 포함되어 있는지 여부를 확인합니다. |
| 4 | CopyTo(T[]) 전체 SortedSet<T>를 호환 가능한 1차원 배열의 처음부터 복사합니다. |
| 5 | CopyTo(T[], Int32) 지정된 배열 인덱스부터 전체 SortedSet<T>를 호환 가능한 1차원 배열에 복사합니다. |
| 6 | CopyTo(T[], Int32, Int32) 지정된 배열 인덱스부터 지정한 개수만큼의 요소를 SortedSet<T>에서 호환 가능한 1차원 배열로 복사합니다. |
| 7 | CreateSetComparer() 개별 집합들을 포함하는 컬렉션을 만들 때 사용할 수 있는 IEqualityComparer 개체를 반환합니다. |
그 외에도 SortedSet은 IsSupersetOf(), IsSubsetOf(), UnionWith(), IntersectWith() 등 집합 연산에 유용한 메서드들을 함께 제공합니다.
예제 1: 특정 요소 포함 여부 확인하기
다음 예제는 SortedSet에 특정 요소가 존재하는지 Contains() 메서드로 확인하고, IsSupersetOf() 메서드로 상위 집합 여부를 판별하는 코드입니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
SortedSet<string> set1 = new SortedSet<string>();
set1.Add("CD");
set1.Add("CD");
set1.Add("CD");
set1.Add("CD");
Console.WriteLine("Elements in SortedSet1...");
foreach (string res in set1) {
Console.WriteLine(res);
}
Console.WriteLine("Does the SortedSet1 contains the element DE? = "+set1.Contains("DE"));
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("Elements in SortedSet2...");
foreach (string res in set2) {
Console.WriteLine(res);
}
Console.WriteLine("SortedSet2 is a superset of SortedSet1? = "+set2.IsSupersetOf(set1));
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Elements in SortedSet1... CD Does the SortedSet1 contains the element DE? = False Elements in SortedSet2... AB BC CD DE EF HI JK SortedSet2 is a superset of SortedSet1? = True
출력 결과에서 알 수 있듯이, set1에 동일한 값 "CD"를 네 번 추가했지만 집합의 특성상 중복은 저장되지 않고 하나의 "CD"만 유지됩니다. 또한 set2가 set1의 모든 요소("CD")를 포함하고 있으므로 IsSupersetOf() 결과는 True가 됩니다.
예제 2: 열거자(Enumerator)로 SortedSet 순회하기
다음 예제는 GetEnumerator() 메서드를 통해 열거자를 얻어 SortedSet의 요소를 하나씩 순회하는 방법을 보여줍니다.
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");
Console.WriteLine("Elements in SortedSet1...");
foreach (string res in set1) {
Console.WriteLine(res);
}
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("Elements in SortedSet2 (Enumerator for SortedSet)...");
SortedSet<string>.Enumerator demoEnum = set2.GetEnumerator();
while (demoEnum.MoveNext()) {
string res = demoEnum.Current;
Console.WriteLine(res);
}
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Elements in SortedSet1... AB BC CD EF Elements in SortedSet2 (Enumerator for SortedSet)... AB BC CD DE EF HI JK
두 예제 모두 요소가 삽입된 순서와 무관하게 항상 사전순(오름차순)으로 출력되는 것을 확인할 수 있습니다. 이처럼 SortedSet은 정렬 상태 유지와 중복 제거가 동시에 필요한 경우에 매우 유용하게 활용할 수 있는 컬렉션 클래스입니다.