2010-01-02 3 views

답변

6

나는 그렇지 않다. 난 그냥 사용하십시오 :

foreach(var item in list.Where(x=>x.StartsWith("a"))) { 
    Console.WriteLine(item + " matches!"); 
} 

하지만 당신은 사용할 수 있습니다 :`는 IEnumerable `(list.Where``의 결과)에는`ForEach` 방법이

list.FindAll(x=>x.StartsWith("a")) 
    .ForEach(item=>Console.WriteLine(item + " matches!")); 
+0

왜 이것을 사용하지 않습니까 (읽기 쉽기 때문에, 성능 ...)? – Rookian

+1

'FindAll' 또는'Where.ToList' 접근법이 목적을 위해 추가 목록을 소개하기 때문에 좋아하지 않습니다. 그리고'ForEach' 확장 메소드가 환경 변경을 정당화하기에 충분하다는 것을 알 수 없습니다. 캡처 등을 소개합니다. LINQ는 부작용이 아닌 ** 쿼리 **에 관한 것입니다. 내가 용서할 Parallel.ForEach를 제외하고, -p –

+0

MoreLinq? 더 많은 charecters. –

3
list.FindAll(x=>x.StartsWith("a")) 
    .ForEach(x => Console.WriteLine(x + " matches!")); 

또는 당신은 당신의 자신의 CallActionForEachMatch 확장 작성할 수 있습니다

public static void CallActionForEachMatch<T>(this IEnumerable<T> values, Func<T, bool> pred, Action<T> act) 
{ 
    foreach (var value in values.Where(pred)) 
    { 
     act(value); 
    } 
} 
2

이 같은 확장 방법은 무엇인가 :

static public void CallActionForEachMatch(this List<T> list, Func<T, bool> criteria, Action<T> action) 
{ 
    list.Where(criteria).ToList().ForEach(action); 
} 
+0

없습니다. – jason

+0

이것은 작동하지 않을 것이고, 당신은'CallActionForEachMatch '을 사용해야하고 다른 확장자가 없으면 ForEach는 List for IEnumerable 입니다. –

+0

나는 이런 말을했다. ;) 고정 ... –

3

쓰기 확장 방법 :

static class IEnumerableForEachExtensions { 
    public static void ForEachMatch<T>(this IEnumerable<T> items, 
     Predicate<T> predicate, 
     Action<T> action 
    ) { 
     items.Where(x => predicate(x)).ForEach(action); 
    } 

    public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) { 
     foreach(T item in items) { 
      action(item); 
     } 
    } 
} 

을 사용법 :

// list is List<string> 
list.ForEachMatch(s => s.StartsWith("a"), s => Console.WriteLine(s)); 

참고로 이것은 무엇이든을 IEnumerable<T> 먹을 것이기 때문에 일반적입니다. 명백한 부작용 때문에 LINQ의 남용이라고 생각할 수있는 것이 있습니다.

+0

부작용이란 무엇입니까? – Rookian

+0

@Rookian LINQ는 "언어 통합 ** 쿼리 **"입니다 - "쿼리"는 읽기 전용입니다. 즉, 해당 시퀀스 또는 해당 시퀀스의 멤버에 영향을주지 않습니다 ("부작용"이라고 함). . 당신이 묘사하는 것은 않습니다. 따라서 LINQ가 가장 적합한 선택이 아닙니다. –

+0

부작용은 상태가 수정 된 경우 (외부와의 상호 작용 포함)입니다. 함수형 프로그래밍에서 LINQ가 모델링 된 것은 큰 no-no입니다. 또 다른 문제는 객체의 수명을 변경할 수있는 이와 같은 메소드를 사용할 때 발생할 수있는 클로저 의미 체계가 있다는 것입니다. 때때로 구식 명령형 코드가 가장 좋습니다. :-) – jason

관련 문제