C#의 SortedSet<T> 컬렉션에 저장된 요소를 순서대로 하나씩 탐색하려면 GetEnumerator() 메서드를 사용하여 열거자(Enumerator)를 가져올 수 있습니다. 열거자는 컬렉션의 요소를 읽기 전용으로 앞뒤 없이 순차적으로 반복할 때 유용합니다.
열거자를 사용하는 일반적인 패턴은 다음과 같습니다.
- GetEnumerator(): SortedSet의 요소를 반복하는 열거자를 반환합니다.
- MoveNext(): 열거자를 다음 요소로 이동시키며, 더 이상 요소가 없으면 false를 반환합니다.
- Current: 현재 위치의 요소 값을 가져옵니다.
예제 1: 문자열 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("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("SortedSet2의 요소 (열거자 사용)...");
SortedSet<string>.Enumerator demoEnum = set2.GetEnumerator();
while (demoEnum.MoveNext()) {
string res = demoEnum.Current;
Console.WriteLine(res);
}
}
}출력 결과
SortedSet1의 요소... AB BC CD EF SortedSet2의 요소 (열거자 사용)... AB BC CD DE EF HI JK
위 예제에서 첫 번째 집합은 foreach 문으로 출력했고, 두 번째 집합은 명시적으로 GetEnumerator()를 호출하여 while 루프와 함께 사용했습니다. 두 방식 모두 내부적으로 동일한 열거 메커니즘을 사용하지만, 열거자를 직접 다루면 루프 흐름을 더 세밀하게 제어할 수 있다는 장점이 있습니다.
또한 주목할 점은 요소를 추가한 순서와 관계없이 항상 정렬된 순서(여기서는 사전순)로 출력된다는 것입니다. 이것이 SortedSet의 핵심 특징입니다.
예제 2: 정수형 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);
set1.Add(400);
set1.Add(500);
set1.Add(600);
set1.Add(700);
Console.WriteLine("SortedSet의 요소 (열거자 사용)...");
SortedSet<int>.Enumerator demoEnum = set1.GetEnumerator();
while (demoEnum.MoveNext()) {
int res = demoEnum.Current;
Console.WriteLine(res);
}
}
}출력 결과
SortedSet의 요소 (열거자 사용)... 100 200 300 400 500 600 700
정리
SortedSet의 열거자는 SortedSet<T>.Enumerator 구조체 타입으로 반환되며, 값 타입이므로 박싱(boxing)이 발생하지 않아 성능 면에서도 효율적입니다. 단, 열거자는 생성 시점의 컬렉션 상태를 기준으로 동작하므로, 열거 도중 컬렉션이 수정되면 InvalidOperationException이 발생할 수 있다는 점에 유의해야 합니다.