2014-12-05 4 views
-1

나 문자열 아이템리스트대리인

List<string> input = new List<string>() { "cat", "toast", "house" }; 
Func<string, bool> filter = null; 
filter += x => x.EndsWith("t"); 
filter += y => y.Contains('o'); 
List<string> output = input.Where(filter).ToList(); //toast, house 

I 그것이 t 끝나는 및 O를 포함하고 있기 때문에 그 결과는 "유명인"것으로 기대를 필터링한다 여기 다음 예를 갖는다. 그러나 그 결과는 토스트입니다, 집 - 내 실수는 무엇입니까?

+0

를 돌려 필터는

filter = x => x.EndsWith("t") && x.Contains('o'); 

답변

1

멀티 캐스트 대리자의 반환 값은 호출 목록의 마지막 메서드의 반환 값입니다. 따라서 func는 주어진 매개 변수가 o을 포함하는지 확인하고 EndsWith의 결과를 무시합니다.

이것은 그 호출 순서리스트 기적, 호출리스트 각 메소드를 호출하는 것에 의해, 복수의 엔트리로 진행 포함 대리자 인스턴스 C# 5.0 Specification, §15.4 Delegate Invocations

호출로 언급된다. 호출 된 각 메서드는 대리자 인스턴스에 주어진 것과 동일한 인수 집합을 전달받습니다. [...] 대리자 호출에 출력 매개 변수 또는 반환 값이 포함 된 경우 최종 값은에서의 마지막 대리자 호출에서 가져옵니다. 그 목록.

두 조건에 대한 당신 싶어 검사가 && 사용하는 경우 : Func을 마지막 방법으로 실행 사용이

 List<string> input = new List<string>() { "cat", "toast", "house" }; 
     Func<string, bool> filter = null; 
     filter += x => x.EndsWith("t") && x.Contains('o'); 
+0

제 경우에는 첫 번째 메소드가 호출되지만 무시됩니다? 음, 나는 "&&"- 솔루션을 알고 있지만 여러 방법/lambda-expression을 사용하여이 문제를 해결하고 싶습니다. – fubo

+0

@fubo yes. 두 값 모두에 대해 두 메소드가 호출되지만 두 x 째 값의 결과 만 Contains로 리턴됩니다. –

+0

그게 역 겹긴하지만 정답입니다 :) 고마워요. – fubo

0

&&`사용`하지 말아야

를?