Pav*_*gin 2 c# linq functional-programming aggregate
比方说我有一个IEnumerable<Func<object, bool>>
.我想创建一个新的Func<object, bool>
,如果该列表的每个函数在某个对象上调用时返回true,则返回true.换句话说,我想聚合(reduce\foldl)一个函数列表.
像这样做:
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)