C#에서 LinkedList<T>의 요소를 순차적으로 탐색하려면 GetEnumerator() 메서드를 사용해 열거자(Enumerator)를 얻을 수 있습니다. 열거자는 컬렉션 내부 구조를 노출하지 않으면서 각 요소에 순서대로 접근할 수 있게 해주는 객체입니다.
기본 사용 예제
다음은 GetEnumerator()로 열거자를 얻어 LinkedList를 순회하는 코드입니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
LinkedList<string> list = new LinkedList<string>();
list.AddLast("A");
list.AddLast("B");
list.AddLast("C");
list.AddLast("D");
list.AddLast("E");
list.AddLast("F");
list.AddLast("G");
list.AddLast("H");
list.AddLast("I");
list.AddLast("J");
Console.WriteLine("노드 개수 = " + list.Count);
Console.WriteLine("LinkedList의 요소들... (열거자로 순회)");
LinkedList<string>.Enumerator demoEnum = list.GetEnumerator();
while (demoEnum.MoveNext()) {
string res = demoEnum.Current;
Console.WriteLine(res);
}
}
}출력 결과
노드 개수 = 10 LinkedList의 요소들... (열거자로 순회) A B C D E F G H I J
동작 원리
GetEnumerator() 메서드는 LinkedList<string>.Enumerator 타입의 열거자를 반환합니다. 이후 MoveNext()를 호출할 때마다 커서가 다음 노드로 이동하며, 더 이상 요소가 없으면 false를 반환해 while 루프가 종료됩니다. 현재 위치의 값은 Current 속성으로 읽어올 수 있습니다.
foreach와 열거자 비교 예제
아래 예제는 foreach 문과 명시적 열거자 두 가지 방식을 함께 보여줍니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(String[] args) {
LinkedList<string> list1 = new LinkedList<string>();
list1.AddLast("One");
list1.AddLast("Two");
list1.AddLast("Three");
list1.AddLast("Four");
list1.AddLast("Five");
Console.WriteLine("LinkedList1의 요소들...");
foreach (string res in list1) {
Console.WriteLine(res);
}
LinkedList<string> list2 = new LinkedList<string>();
list2.AddLast("India");
list2.AddLast("US");
list2.AddLast("UK");
list2.AddLast("Canada");
list2.AddLast("Poland");
list2.AddLast("Netherlands");
Console.WriteLine("LinkedList2의 요소들... (열거자로 순회)");
LinkedList<string>.Enumerator demoEnum = list2.GetEnumerator();
while (demoEnum.MoveNext()) {
string res = demoEnum.Current;
Console.WriteLine(res);
}
LinkedList<string> list3 = new LinkedList<string>();
list3 = list2;
Console.WriteLine("LinkedList3이 LinkedList2와 같은가? = " + list3.Equals(list2));
}
}출력 결과
LinkedList1의 요소들... One Two Three Four Five LinkedList2의 요소들... (열거자로 순회) India US UK Canada Poland Netherlands LinkedList3이 LinkedList2와 같은가? = True
정리 및 참고 사항
- GetEnumerator()는 IEnumerable<T> 인터페이스의 멤버로, 모든 .NET 컬렉션에서 기본 제공됩니다.
- 일반적인 경우에는 foreach 문이 내부적으로 열거자를 생성·관리하므로 더 간결하고 안전합니다.
- 명시적 열거자는 MoveNext()와 Current를 직접 제어해야 하는 상황(예: 특정 지점부터 순회 재개, 세밀한 반복 흐름 제어)에서 유용합니다.
- 열거자는 컬렉션이 수정되면 무효화될 수 있으므로, 순회 중에는 AddLast/Remove 등으로 컬렉션을 변경하지 않는 것이 좋습니다.
- list3 = list2처럼 대입하면 새 리스트가 복사되는 것이 아니라 동일한 객체를 참조하게 되므로 Equals() 비교 결과가 True입니다.