2009-08-26 4 views
2

빠른 질문이 있습니다. Dictionary.Value 컬렉션의 반복 작업을 많이하고 호출해야하는 불편한 문제가 있습니다 .ToList()를 호출하면 호출 할 수 있습니다. .ForEach (Dictionary 자체의 컬렉션, Key 컬렉션 또는 Values ​​컬렉션)에는 ForEach 확장 메서드가 있습니다..NET : ForEach() 확장 메서드 및 사전

ForEach() 확장 메소드가 이러한 콜렉션에 구현되지 않은 이유가 있습니까? 아니면 MS가 중요하지 않다고 느낀 이유가 있습니까?

사전 컬렉션을 반복하는 것이 일반적이지 않습니까? 레코드 ID 값을 키로 사용하여 데이터베이스에서 데이터를 가져올 때 목록 대신 사전을 사용합니다. 나는 이드 키로 조회조차하지 않은 시간을 많이 받아 들여야 만하지만, 내가 습득 한 습관 일 뿐이다. ...

+1

왜 직접 확장 프로그램을 작성하지 않으시겠습니까? –

답변

8

Eric Lippert explains why Microsoft didn't write a ForEach extension method.

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) { 
    if (sequence == null) throw new ArgumentNullException("sequence"); 
    if (action == null) throw new ArgumentNullException("action"); 
    foreach(T item in sequence) 
     action(item); 
} 

//Return false to stop the loop 
public static void ForEach<T>(this IEnumerable<T> sequence, Func<T, bool> action) { 
    if (sequence == null) throw new ArgumentNullException("sequence"); 
    if (action == null) throw new ArgumentNullException("action"); 

    foreach(T item in sequence) 
     if (!action(item)) 
      return; 
} 
+2

Eric의 기사는 좋은 점을 제시합니다. 나는 사람들이 당신의 대답을 너무 미쳐 가기 전에 그것을 읽었 으면 좋겠다. – patridge

+0

Eric은'IEnumerable <>'에 대해 일반적인 ForEach에 대해 좋은 논쟁을하지만,'Dictionary <>'에 대해서는'foreach' 루프가'KeyValuePair'를 제공하기 때문에 여전히 유리할 것입니다,하지만 λ는 두 개의 인수를 갖습니다. 하나는 키에 대한 것이고 다른 하나는 값에 대한 것으로, 이는 코드를 더 깨끗하게 보입니다. – gpvos

1

거기에 대한 이유가 없다 (IMO) IEnumerable <T> (대신 목록 <T>)에 구현 된 ForEach 확장 메서드 내 공통 라이브러리에서 ForEach 확장 메서드를 만들었으니 몇 줄의 코드 일뿐입니다.

public static void ForEach<T>(this IEnumerable<T> list, Action<T> action) { 
    foreach(var o in list) { 
     action(o); 
    } 
} 
2

흠이의이 대답에 내 의견을 업그레이드하자, 그래서 읽을 수있는 코드를 포함 할 수 있습니다 :

당신은 하나를 직접 작성할 수 있습니다.

에릭 IEnumerable<>에 일반 ForEach에 대한 좋은 인수를 만들지 만, 일반 foreach 루프가 당신에게 KeyValuePair를 제공하기 때문에 Dictionary<> 것이 여전히 바람직 할 것이다,하지만 람다는 두 개의 인수, 키의 하나 하나를 가질 수 이 값은 코드를 더 깨끗하게 보입니다.

public static void ForEach<TKey, TValue>(this Dictionary<TKey, TValue> dict, Action<TKey, TValue> action) { 
    if (dict == null) throw new ArgumentNullException("dict"); 
    if (action == null) throw new ArgumentNullException("action"); 

    foreach (KeyValuePair<TKey, TValue> item in dict) { 
     action(item.Key, item.Value); 
    } 
}