본문 바로가기
C#

C#] 반복자(Iterator), yield keyword

by Fastlane 2022. 7. 19.
728x90
반응형

yield

Iterator는 yield라는 keyword를 사용한다. yield는 colleciton, array를 순회하며 호출한 함수에 element를 하나씩 반환한다. 

yield break를 사용하여 반복기를 종료할 수 있다. 

public static IEnumerable<int> Fibonacci(int length)
{
    int a = 0, b = 1;
    for (int i = 0; i < length; i++)
    {
        yield return a; //이 시점의 a가 반환된다. 
        int c = a + b;
        a = b;
        b = c;
    }
}

static void Main(string[] args)
{
    // Display the Fibonacci sequence up to the tenth number.
    foreach (int i in Fibonacci(10))
    {
        Console.Write(i + " ");
    }
}

// output
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

yield return 문구는 동일한 code block에서 여러번 사용할 수 있다. 

public static IEnumerable<int> SomeNumbers()
{
    yield return 1;
    yield return 2;
    yield return 7;
    yield return 8;
    yield return 5;
}

var someNumbers = SomeNumbers();

string allNumbers = "";
foreach(int number in someNumbers)
{
    allNumbers += " " + number.ToString();
}

Console.WriteLine(allNumbers.Trim());
Console.WriteLine("Average: " + someNumbers.Average());

Iterator

Custom Collection Class

static void Main()
{
    DaysOfTheWeek days = new DaysOfTheWeek();

    foreach (string day in days)
    {
        Console.Write(day + " ");
    }
    // Output: Sun Mon Tue Wed Thu Fri Sat
    Console.ReadKey();
}

public class DaysOfTheWeek : IEnumerable
{
    private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    
    // IEnumerable 인터페이스 구현
    public IEnumerator GetEnumerator()
    {
        for (int index = 0; index < days.Length; index++)
        {
            // Yield each day of the week.
            yield return days[index];
        }
    }
}
728x90
반응형

댓글