방프리
21.04.24 Chapter4. LINQ 활용 (Item 33) 본문
Item 33 : 필요한 시점에 필요한 요소를 생성하라
이터레이터 메서드에 입력 매개변수로 굳이 시퀸스를 전달할 필요는 없다. 이터레이터 메서드 내에서
시퀸스를 생성하는 것도 나쁘지 않은 방법이다. 하지만 시퀸스를 생성하는 중간에 해당 시퀸스를
다른 부분에서 참조할 때 문제의 요소가 굉장히 많다. 또한 중간에 작업을 멈출 수도 없기 때문에
병목 현상이 발생할 수도 있다. 이런 시퀸스 생성 메서드를 이터레이터 함수로 구현한다면?
자연스럽게 해결될 것이다.
//문제의 요소가 있는 메서드
static IList<int> CreateSequence(int numberOfElements,
int startAt, int stepBy)
{
var collection = new List<int>(numberOfElements);
for(int i = 0; i < numberOfelements)
collection.Add(startAt + i * stepBy);
return collection;
}
//이터레이터를 통해 요청이 들어오면 return
static IEnumerator<int> CreateSequence(int numberOfElements,
int startAt, int stempBy)
{
for(var i = 0; i < numberOfElements; i++)
yield return startAt + i * stepBy;
}
시퀸스 생성 중간에 작업을 중단해야한다면 지연 실행을 할 수 있는데
// 익명 델리게이트를 사용
var sequence = CreateSequence(10000, 0, 7).
TakeWhile(delegate (int num) { return num < 1000; });
// 람다 표기법을 사용
var sequence = CreateSequence(10000, 0, 7).
TakeWhile((num) => num < 1000);
이터레이터 메서드로 변환함으로써 다음과 같이 작업을 중단할 수 있는 코드로 언제든지 변환이 가능하다.
병렬 프로그래밍으로 변환하더라도 지속 여부나 순회를 중단할 수도 있다.
'C# > Effective C#' 카테고리의 다른 글
21.06.03Chapter4. LINQ 활용 (Item 35) (0) | 2021.06.03 |
---|---|
21.05.29Chapter4. LINQ 활용 (Item 34) (0) | 2021.05.29 |
21.04.20 Chapter4. LINQ 활용 (Item 32) (0) | 2021.04.20 |
21.04.15 Chapter4. LINQ 활용 (Item 31) (0) | 2021.04.16 |
21.04.03 Chapter4. LINQ 활용 (Item 30) (0) | 2021.04.03 |
Comments