2011-04-05 2 views
1

Generic ForEach를 구현하는 올바른 방법은 무엇입니까?Generic ForEach를 구현하는 올바른 방법은 무엇입니까

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    if (source == null) 
     throw new ArgumentNullException("source"); 

    if (action == null) 
     throw new ArgumentNullException("action"); 

    foreach (T item in source) 
     action(item); 
} 

또는

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    if (source == null) 
     throw new ArgumentNullException("source"); 

    if (action == null) 
     throw new ArgumentNullException("action"); 

    foreach (T item in source) 
    { 
     T item0 = item; 
     action(item0); 
    } 
} 
+2

그래서, 본질적으로, 당신은 X (Y)'사이 정확한지 요구하고; '및'TZ = Y; X (Z); – BoltClock

+0

@BoltClock 내 문제는 "수정 된 클로저에 대한 액세스"입니다. –

답변

6

그것은 차이가 없습니다. 당신은 을 여기에서 루프 반복자 변수을 캡처하지 않으므로 normal "closing over the loop variable" problem에 대해 걱정할 필요가 없습니다.

개인적으로 나는 첫 번째 접근법을 선호하지만 모든 곳에 중괄호를 사용합니다.이 경우 루프 내부에 변수를 만들 필요가 없습니다.

+0

답변 해 주셔서 감사합니다. Resharper에서 "수정 된 클로저에 대한 액세스"에 대한 알림을받습니다. item0을 제거해도 괜찮습니까? –

0

방법에 대해 :

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    source.ToList().ForEach(action); 
} 

또는 먼저 예외를 확인하려면 :

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    if (source == null) 
     throw new ArgumentNullException("source"); 

    if (action == null) 
     throw new ArgumentNullException("action"); 

    source.ToList().ForEach(action); 
} 
+0

에 ForEach (value => action (value))가 있지만 ForEach (action)가 동일하다고 생각합니다. –

관련 문제