Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# LinkedList를 순회하는 열거자(Enumerator) 얻는 방법

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입니다.