[Effective C#] 아이템 32: Action, Predicate, Function과 순회 방식을 분리하라
C# 카테고리의 다른 글
이터레이터 메서드의 사용 방식에는 크게 두가지 유형이 있다.
- 시퀀스 내의 개별 항목을 이용하여 작업을 수행하는 유형 (Action, Predicate, Function)
- 시퀀스의 순회 방식에 변경을 주는 유형
아이템 31에서 예시로 들었던 Unique
시퀀스 내의 개별 항목을 이용하여 작업을 수행하는 유형에는 델리게이트가 사용될 수 있다.
자주 사용되는 3가지 유형의 델리게이트는 .NET 라이브러리 내에 포함되어 있다.
namespace System
{
public delegate bool Predicate<T>(T obj);
public delegate void Action<T>(T obj);
public delegate TResult Func<T, TResult>(T arg);
}
다음은 델리게이트를 사용하는 시퀀스 메서드의 사용 예시 코드이다.
// List<T>.RemoveAll() 메서드는 Perdicate를 사용한다. (값이 5인 멤버를 모두 제거)
myInts.RemoveAll(collectionMember => collectionMember == 5);
// List<T>.ForEach() 메서드는 Action을 사용한다. (모든 멤버를 각각 출력)
myInts.ForEach(collectionMemeber => WriteLine(collectionMember));
다음은 시퀀스 내의 개별 항목을 이용하여 작업을 수행하는 유형의 예이다.
// Predicate<T>를 사용한 필터 메서드
public static IEnumerable<T> Where<T>(
IEnumerable<T> sequence,
Predicate<T> filterFunc)
{
foreach (T item in sequence)
if (filterFunc(item))
yield return item;
}
// Func<T>를 사용하여 새로운 시퀀스를 생성하는 메서드
public static IEnumerable<T> Select<T>(
IEnumerable<T> sequence, Func<T, T> method)
{
foreach (T element in sequence)
yield return method(element);
}
위에서 설명했던 것처럼 (1) 시퀀스를 순회하는 것과 (2) 시퀀스의 개별 요소에 대해 작업을 수행하는 것을 구분해야 한다.
시퀀스의 개별 요소에 대해 작업을 수행할 때에는 델리게이트를 이용할 수 있다.
댓글남기기