yield 문과 Iterator에 대해서
C#/Story2019. 9. 16. 17:29
IEnumrable<int> Range(int start,int end) {
for (int i=start;i<end;i++) {
yield return i;
}
}
이런식으로 yield return 같은 방법으로 값을 반환하는데 쓴다.
yield 키워드가 없었다면 이 함수는 항상 start(int)값을 반환하는 함수가 되었겠지만
yield 문은 함수가 어디까지 실행되었는지를 기억해서 그 이후부터 실행하기 때문에
이 함수는 start부터 end-1값까지의 이터레이터를 반환하는 함수가 된다.
그럼 이터레이터를 반환하지않고 그냥 리스트를 반환하면 되지라고 생각할 수도 있으나
그 차이를 알아보기 위해 위 함수와 같은 행동을 하는 RangeInList 작성해보았다.
IEnumrable<int> RangeInEnumerable(int start,int end) {
for (int i=start;i<end;i++) {
Console.Write(i);
yield return i;
}
}
List<int> RangeInList(int start,int end) {
var list=new List<int>();
for (int i=start;i<end;i++) {
Console.Write(i);
list.Add(i);
}
return list;
}
static void Main() {
RangeInEnumerable(0,10000).Take(5).Foreach(x=>{
//Action
});//Console Result: 01234
RangeInList(0,10000).Take(5).Foreach(x=>{
//Action
});//Console Result: 012345....9999
}
이터레이터를 반환하는 함수는 해당 Element가 필요할 때 까지 지연했다가 쿼리가 끝날때 한번만 순회한다.
그러므로 Linq와 같은 쿼리구문과 궁합이 매우 좋고 시퀀스를 처리하는데 매우 적합하다.
'C# > Story' 카테고리의 다른 글
ObservableCollection에 대해서 (0) | 2019.11.02 |
---|---|
2차원 배열과 Matrix Class 제작 (0) | 2019.09.23 |
댓글()