[C#] Yield와 Enumerator
C#에서 yield가 자주 사용되는 곳은 집합적 데이터를 가지고 있는 컬렉션 클래스이며,
일반적으로 컬렉션 클래스는 데이터 요소를 하나 하나 사용하기 위해 흔히 Enumerator(Iterator)를 구현하는 경우가 많습니다 Enumrator를 구현하는 한 방법으로 yield를 사용할 수 있습니다.
Enumerator는 데이터 요소를 하나씩 리턴하는 기능을 하는 것으로 C#.net에서는 IEnumerator라는 인터페이스를 구현해야 합니다 인터페이스는 Current(속성), MoveNext() (메서드), Reset() (메서드) 등 3개의 멤버로 이루어져 있는데, Enumerator가 되기 위해서 Current와 MoveNext()를 반드시 구현해야 합니다.
public class MyList
{
private int[] data = { 1, 2, 3, 4, 5 };
public IEnumerator GetEnumerator()
{
int i = 0;
while (i < data.Length)
{
yield return data[i];
i++;
}
}
//...
}
// (1) foreach 사용하여 Iteration
var list = new MyList();
foreach (var item in list)
{
Console.WriteLine(item);
}
// (2) 수동 Iteration
IEnumerator it = list.GetEnumerator();
it.MoveNext();
Console.WriteLine(it.Current); // 1
it.MoveNext();
Console.WriteLine(it.Current); // 2