2014-12-05 66 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 

我希望,因为它以T结尾,包含○结果是“面包”。但结果是敬酒,家 - 我的错误是什么?

+0

你不应该使用''&&? – 2014-12-05 14:02:28

回答

1

多播委托的返回值是调用列表中最后一个方法的返回值。所以你的func只检查给定的参数是否包含o而忽略EndsWith的结果。

C# 5.0 Specification, §15.4 Delegate Invocations

调用委托实例的调用其列表包含通过调用每个方法中调用列表,同步地,为了多个条目进行陈述。 [...] 如果委托调用包含输出参数或返回值,则它们的最终值将来自调用最后一个委托列表。

如果两个条件想检查使用&&

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

所以在我的情况下,第一种方法被调用,但被忽略?是的,我知道“&&” - 解决方案,但我想用多种方法/ lambda表达式来解决这个问题 – fubo 2014-12-05 14:09:24

+0

@fubo yes。每个值都会调用两种方法,但只返回包含第二个的结果。 – 2014-12-05 14:10:01

+0

这是讨厌的,但正确的答案:)谢谢 – fubo 2014-12-05 14:26:57

0

过滤Func键返回最后执行的方法使用该

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