반복기 사용(C# 프로그래밍 가이드)

반복기를 만드는 가장 일반적인 방식은 IEnumerable 인터페이스에 대한 GetEnumerator 메서드를 구현하는 것입니다. 예를 들면 다음과 같습니다.

public System.Collections.IEnumerator GetEnumerator()
{
    for (int i = 0; i < 10; i++)
    {
        yield return i;
    }
}

GetEnumerator 메서드가 있으면 형식을 열거 가능한 형식으로 만들고 foreach 문을 사용할 수 있습니다. 위의 메서드가 ListClass에 대한 클래스 정의의 일부인 경우 다음과 같이 클래스에 대해 foreach를 사용할 수 있습니다.

static void Main()
{
    ListClass listClass1 = new ListClass();

    foreach (int i in listClass1)
    {
        System.Console.Write(i + " ");
    }
    // Output: 0 1 2 3 4 5 6 7 8 9
}

foreach 문은 ListClass.GetEnumerator()를 호출하고 반환된 열거자를 사용하여 값을 반복합니다. IEnumerator<T> 인터페이스를 반환하는 제네릭 반복기를 만드는 방법의 예제는 방법: 제네릭 목록에 대한 반복기 블록 만들기(C# 프로그래밍 가이드)를 참조하십시오.

명명된 반복기를 사용하면 동일한 데이터 컬렉션을 각기 다른 방법으로 반복할 수도 있습니다. 예를 들어, 요소를 오름차순으로 반환하는 반복기와 요소를 내림차순으로 반환하는 반복기를 지정할 수 있습니다. 반복기에 매개 변수를 사용하여 클라이언트에서 반복기의 동작 전체 또는 일부를 제어할 수도 있습니다. 다음 반복기는 SampleIterator라는 명명된 반복기를 사용하여 IEnumerable 인터페이스를 구현합니다.

// Implementing the enumerable pattern
public System.Collections.IEnumerable SampleIterator(int start, int end)
{
    for (int i = start; i <= end; i++)
    {
        yield return i;
    }
}

명명된 반복기는 다음과 같이 호출합니다.

ListClass test = new ListClass();

foreach (int n in test.SampleIterator(1, 10))
{
    System.Console.Write(n + " ");
}
// Output: 1 2 3 4 5 6 7 8 9 10

다음 예제에서와 같이 동일한 반복기에 yield 문을 여러 개 사용할 수 있습니다.

public System.Collections.IEnumerator GetEnumerator()
{
    yield return "With an iterator, ";
    yield return "more than one ";
    yield return "value can be returned";
    yield return ".";
}

다음과 같은 foreach 문을 사용하여 결과를 출력할 수 있습니다.

foreach (string element in new TestClass())
{
    System.Console.Write(element);
}
// Output: With an iterator, more than one value can be returned.

이 예제의 결과 텍스트는 다음과 같습니다.

With an iterator, more than one value can be returned.

IEnumerator.MoveNext에 대한 직접 호출이나 foreach 루프의 이어지는 각 반복에서 다음 반복기 코드 본문은 이전 yield 문 이후에 다시 시작되고 반복기 본문의 끝에 도달하거나 yield break 문이 발견될 때까지 계속 실행됩니다.

반복기는 IEnumerator.Reset 메서드를 지원하지 않습니다. 처음부터 다시 반복하려면 새 반복기를 가져와야 합니다.

예제

다음 코드에는 이 항목의 모든 예제가 포함되어 있습니다.

namespace UsingIterators
{
    class Program
    {
        static void Main()
        {
            // Using a simple iterator.
            ListClass listClass1 = new ListClass();

            foreach (int i in listClass1)
            {
                System.Console.Write(i + " ");
            }
            // Output: 0 1 2 3 4 5 6 7 8 9
            System.Console.WriteLine();


            // Using a named iterator.
            ListClass test = new ListClass();

            foreach (int n in test.SampleIterator(1, 10))
            {
                System.Console.Write(n + " ");
            }
            // Output: 1 2 3 4 5 6 7 8 9 10
            System.Console.WriteLine();


            // Using multiple yield statements.
            foreach (string element in new TestClass())
            {
                System.Console.Write(element);
            }
            // Output: With an iterator, more than one value can be returned.
            System.Console.WriteLine();

        }
    }

    class ListClass : System.Collections.IEnumerable
    {

        public System.Collections.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < 10; i++)
            {
                yield return i;
            }
        }

        // Implementing the enumerable pattern
        public System.Collections.IEnumerable SampleIterator(int start, int end)
        {
            for (int i = start; i <= end; i++)
            {
                yield return i;
            }
        }
    }

    class TestClass : System.Collections.IEnumerable
    {
        public System.Collections.IEnumerator GetEnumerator()
        {
            yield return "With an iterator, ";
            yield return "more than one ";
            yield return "value can be returned";
            yield return ".";
        }
    }
}

참고 항목

작업

방법: 정수 목록에 대한 반복기 블록 만들기(C# 프로그래밍 가이드)

방법: 제네릭 목록에 대한 반복기 블록 만들기(C# 프로그래밍 가이드)

참조

yield(C# 참조)

배열에 foreach 사용(C# 프로그래밍 가이드)

foreach, in(C# 참조)

개념

C# 프로그래밍 가이드