이터레이터 메서드가 입력 매개변수로 반드시 시퀀스를 전달받아야 할 필요는 없다. 이터레이터

메서드를 구현할 때 통상 새로운 출력 시퀀스를 생성하기 위해서 yield return을 주로 사용하게 되는

데, 이 과정에서 입력 시퀀스를 활용하는 대신 새로운 요소를 생성하는 팩토리 메서드를 사용할 수도

있다. 작업을 수행하기 전에 필요한 요소를 모두 생성해서 컬렉션에 저장 해두는 대신 필요할 때마다

개발 요소를 생성하는 식이다. 이 방법으로 코드를 작성하면 사용되지 않을 요소를 미리 생성하는 것

을 피할 수 있다. 우선 정숫값의 시퀀스를 생성하는 간단한 예부터 살펴보자.

static IList<int> CreateSequence(int numberOfElements, int startAt, int stepBy)
{
		var collection =
				new List<int>(numberOfElements);
		for (int i = 0; i < numberOfElements; i++)
				collection.Add(startAt + i * stepBy);

		return collection;
}

이 코드는 잘 동작하지만 yield return을 이용하여 새로운 시퀀스를 생성하는 것에 비해서는 단점이

많다. 먼저 이 코드는 결과를 List<int>에 저장한다고 가정하고 있다. 클라이언트가 BindingList<int>

와 같이 다른 타입을 요구하면 변환 작업을 반드시 수행해야 한다.

var data = new BindingList<int>(CreateSequence(100, 0, 5).ToList());

이처럼 변환을 수행하면 그 과정에서 미묘한 버그가 발생할 소지가 있다. BindingList<T>는 생성자

의 매개변수로 주어진 리스트를 복사하지 않고 동일한 메모리 공간을 그대로 재사용하는 특징이 있

다. 따라서 매개변수로 전달한 객체를 다른 곳에서 이미 사용하고 있다면 일관성의 문제가 발생할 수

있다. 동일한 저장 공간에 대해서 여러 개의 참조가 사용되는 꼴이기 때문이다.

또한 클라이언트가 중간에 작업을 중단할 수 없기 때문에 CreateSequence() 메서드는 항상 요청된