특정 클래스가 IEnumerable인터페이스를 구현했다면 IEnumerator를 사용해서 내부의 데이터를 순방향으로만 접근할 수 있는 기능을 가진 것이다.
IEnumerator형으로 얻은 객체는 읽기전용 커서(Cursor)를 제공하고 있으며, 데이터의 집하벵 대한 순방향으로 검색할 수 있다.
IEnumerable인터페이스에는 GetEnumerator()함수를 사용해서 IEnumerator를 얻어서 작업을 한다.
IEnumerable인터페이스는 내부에 GetEnumerator()추상함수를 포함하고 있으며, 이 함수를 이용해서 IEnumerator의 객체를 얻을 수 있다.
IEnumerator는 현재 커서 위치에서 데이터를 추출하는 기능을 지원하며 순방향으로 검색기능을 제공하는 것은 항연한 소리이다.
커서를 데이터 집합의 시작점으로 돌리는 기능도 제공한다.
Array클래스는 IEnumerable인터페이스를 구현하였기 때문에 IEnumerator를 사용할 수 있다.
다음 예제는 배열에서 IEnumerable인터페이스를 사용하는 방법을 보여주고 있다.
using System;
using System.Collections;
public class IEnumerableTest
{
public static void Main()
{
string[] authors = { "A", "B", "C", "D", "E", "F" };
IEnumerator e = authors.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine(e.Current);
}
}
}
IEnumerator객체를 얻기 위해서는 GetEnumerator()를 사용하면 된다.
모든 배열은 IEnumerator 인터페이스를 구현하고 있기 때문에 배열에 대해 GetEnumerator()함수를 호출할 수 있다.
IEnumerator객체를 얻은 후 순방향으로 순회하기 위해서 while루프에서 MoveNext()함수를 호출하면 된다.
그리고 MoveNext()로 커서를 움직인 후 커서가 위치한 곳의 데이터를 추출하기 위해서 Current 속성을 이용한다.
이 때 Current의 타입은 Object형이다.
Current포인터를 컬렉션의 처음부분앞에 있는 정의하지 않은 값으로 다시 설정할 때는 Reset()을 호출한다.
Reset()을 호출한 후 Current로 접근하기 전에 MoveNext()를 호출해야 한다.
이유는 처음에는 Current참조가 정의되지 않기 때문이다.
IEnumerator객체가 컬렉션의 마지막 위치에 있을 때 MoveNext()함수를 호출하면 false를 반환한다.
따라서 컬렉션 내의 모든 데이터에 대해 MoveNext()함수가 true를 반환하는 동안 루프를 수행하면서 false가 반환되면 빠져나오는 방법으로 데이터를 검색할 수 있다.
[출처] [C#]IEnumerable, IEnumerator|작성자 아오
'강좌 > C#' 카테고리의 다른 글
global 컨텍스트 키워드 와 :: 연산자 (0) | 2012.01.22 |
---|---|
C# 네트웍 프로그래밍 관련 코딩 팁 (0) | 2012.01.22 |
스레드 일시정지, 재시작 구현(ManualResetEvent 이용) (0) | 2012.01.21 |
C# _ 멀티스레드,ManualResetEvent,동기화 를 시켜보자 (0) | 2012.01.21 |
스레드 동기화를 위한 AutoResetEvent와 ManualResetEvent (0) | 2012.01.21 |