c#/수업 내용

반복기(Iterator)와 yield 정의

이지훈26 2021. 9. 10. 12:55

*반복기

컬렉션의 모든 내용을 반복하려면 foreach 문만 있으면 됩니다. 
하지만 foreach 문이 마법은 아닙니다. 

컬렉션을 반복하는 데 필요한 코드를 생성하기 위해 .NET core 라이브러리에 정의된 두 개의 제네릭 인터페이스인 IEnumerable<T> 및 IEnumerator<T>를 사용합니다. 

반복기 메서드는 요청될 때 시퀀스에서 개체를 생성하는 방법을 정의합니다. 

yield return 상황별 키워드를 사용하여 반복기 메서드를 정의합니다.

이 메서드를 작성하여 0에서 9 사이의 정수 시퀀스를 생성할 수 있습니다.

​둘중 고민하지 마라 반복기 메서드에서 yield return 문을 여러번 쓸수 있다 

반복기 메서드에는 한 가지 중요한 제한이 있습니다. 

return 문과 yield return 문 둘 다를 동일한 메서드에서 사용할 수 없습니다.

 

using System;
using System.Collections.Generic;  //순서3


namespace Helloworld
{
    class App
    {
        
        //생성자
        public App()
        {
            foreach (int num in GetSingleDigiNumbers())  //순서6,  GetSingleDigiNumbers(시퀀스) -> int num in(요소)
            {
                Console.WriteLine(num);
            }
        }

        //반복기 메서드 정의
        IEnumerable<int> GetSingleDigiNumbers()  //순서1, void -> IEnumerable<int> 순서4
        {
            yield return 0;  //순서2
            yield return 1;
            yield return 2;
            yield return 3;
            yield return 4;
            
            for(int i = 0; i < 5; i++)  //순서5
            {
                yield return i + 5;
            }
        }
    }
}

 

using System;
using System.Collections.Generic;  


namespace Helloworld
{
    class App
    {

        //생성자
        public App()
        {
            //컬렉션 초기화, 개체 이니셜라이져사용 
            List<int> list = new List<int> { 1, 2, 3, 4, 5 };

            //foreach문에서 값을 변경하지 말자 
            //foreach (int n in list) {
            //    Console.WriteLine(n);
            //}

            //컬렉션 요소를 변경하고 싶다면 for문 쓰자 
            for (int i = 0; i < list.Count; i++)
            {
                if (i == 2)
                {
                    list[i] = 100;
                }
            }

            //시퀀스 요소를 직접 컨트롤 하고싶으면 사용 
            IEnumerator<int> enumerator = list.GetEnumerator();
            while (enumerator.MoveNext())
            {
                Console.WriteLine(enumerator.Current);
            }

        }
    }
}