이터레이터 메서드의 사용 예를 살피다 보면 크게 두 가지 유형이 있음을 알 수 있다. 시퀀스 내의
개별 항목을 이용하여 작업을 수행하는 유형 외에도, 시퀀스의 순회 방식에 변경을 주는 유형도 있다.
예를 들어 특정 조건에 부합하는 항목만을 가져오거나, 매 N번째 항목만을 건너뛰며 가져오는 매서
드의 경우다.
이처럼 순회 방식에 변경을 주는 유형은 모든 항목에 대해서 어떤 작업을 수행하는 메서드와는 사뭇
다르다. 예를 들어 동일 데이터를 기반으로 다양한 보고서를 생성하고, 일부 값을 합산 하고, 컬렉션
내의 값을 일부 수정하는 등의 작업을 한다고 하자. 어떤 유형의 업무라도 실제로 개별 항목에 대하
여 수행해야 하는 작업의 내용과 시퀀스의 순회 방식은 서로 연관이 없으므로 분리하여 처리할 수 있
다. 이 두 가지를 한 번에 수행하면 코드 간의 결합도도 커지고 중복 코드가 발생하게 된다.
일반적으로 개발자들이 여러 가지 작업을 하나의 메서드에 집어넣어 개발하는 이유는 메서드중간
어딘가를 커스텀화하기가 어렵기 때문이다. 알고리즘의 중간 어디쯤을 커스텀화하는 유일한 방법은
메서드를 호출할 수 있는 무엇인가를 전달하거나 함수 객체를 전달하는 것이다. C#에서는 이를 위해
서 작업을 정의한 델리게이트를 사용할 수 있다. 그리고 좀 더 깔끔하게 람다 표현식을 사용할 수 있
다.
익명 델리게이트를 사용할 때는 function과 action이라는 두 가지 패턴이 있다. function의 특별한
용례인 predicate도 있는데 predicate는 시퀀스 내의 항목이 조건에 부합하는지를 부울로 반화하는