为什么组合lambda表达式在linq中不起作用?

时间:2011-12-26 19:31:57

标签: c# linq lambda

代表可以合并,所以:

MethodInvoker del = delegate { Console.WriteLine("Delegate 1"); };
del += delegate { Console.WriteLine("Delegate 2"); };
del.Invoke();

输出:

Delegate 1 
Delegate 2

因为它调用了这两种方法,所以我试着看看它是否有效:

Func<Person, bool> filters = person => person.Name.Contains("John");
filters += person => person.Age >= 18;

List<Person> persons = getPersons();

persons.Where(filters);

但它没有,只有最后一次应用(在这种情况下,person => person.Age >= 18)。

我的问题是:为什么不呢?有可能实现这个吗? (并不是说我会重写Linq的扩展方法只是为了实现它,但如果可能的话会很酷)

注意: 我知道在LINQ to Objects中,执行此操作会类似,因为执行是延迟的:

persons.Where( x => x.Name.Contains( nameFilter )).Where( x => x.Age >= 18 );

但那不是我感兴趣的。

2 个答案:

答案 0 :(得分:5)

原因是两个过滤器都被执行,但只使用了最后一个委托的返回值。这就是代表们按照规范工作的方式。就像评论所说,我无法想象这将如何以不同的方式起作用。你暗示结果应该是AND,但为什么它们不能被OR编辑?如果结果为strings会怎样?

答案 1 :(得分:1)

这仅适用于Action代理,而不适用于Func委托,因为委托调用只能返回一个结果。