为什么组合lambda表达式不能在linq中工作

本文关键字:linq 工作 不能 组合 lambda 表达式 为什么 | 更新日期: 2023-09-27 18:18:53

委托可以合并,所以:

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);

但是它没有,只应用了last(在本例中是person => person.Age >= 18)。

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

注意:我知道在LINQ to Objects中,这样做是类似的,因为执行是延迟的:

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

但那不是我感兴趣的。

为什么组合lambda表达式不能在linq中工作

原因是两个过滤器都被执行,但只使用最后一个委托的返回值。这就是委托根据规范工作的方式。就像评论说的那样,我无法想象这样做会有什么不同。你在暗示结果应该是AND的,但为什么不能是OR的呢?如果结果是strings会发生什么?

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