如何使用linq将代理聚合到新的委托中

Pav*_*gin 2 c# linq functional-programming aggregate

比方说我有一个IEnumerable<Func<object, bool>>.我想创建一个新的Func<object, bool>,如果该列表的每个函数在某个对象上调用时返回true,则返回true.换句话说,我想聚合(reduce\foldl)一个函数列表.

Jon*_*Jon 5

像这样做:

Func<object, bool> aggregate = o => functions.All(f => f(o));
Run Code Online (Sandbox Code Playgroud)

当然这是作弊,因为函数碰巧返回,bool所以我们可以Enumerable.All直接使用来产生聚合结果.这也有副作用,即不会调用列表中的所有函数 - 只要一个人返回false我们打包并离开.

在一般情况下,这种处理是完成的Enumerable.Aggregate,可以这样:

Func<object, bool> aggregate = o => 
    functions.Select(f => f(o))
             .Aggregate(true, (result, @partial) => result && @partial);
Run Code Online (Sandbox Code Playgroud)