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);
}
}
}
}