假设我有一个IEnumerable<Func<object, bool>>
. Func<object, bool>
如果在某个对象上调用该列表的每个函数都返回 true,我想创建一个 new应该返回 true。换句话说,我想聚合 (reduce\foldl) 一个函数列表。
问问题
833 次
3 回答
6
像这样做:
Func<object, bool> aggregate = o => functions.All(f => f(o));
当然这有点作弊,因为函数恰好返回bool
,所以我们可以Enumerable.All
直接使用来产生聚合结果。这还有一个副作用,不是列表中的所有函数都会被调用——只要一个返回false
,我们就打包离开。
在一般情况下,这种处理是用 完成的Enumerable.Aggregate
,可能是这样的:
Func<object, bool> aggregate = o =>
functions.Select(f => f(o))
.Aggregate(true, (result, @partial) => result && @partial);
于 2013-03-13T22:00:49.437 回答
1
正如乔恩指出的那样,最好的方法是使用Enumerable.All
. 但是,您可以使用折叠序列,Aggregate
因此您也可以这样做:
Func<object, bool> folded = funcs.Aggregate((acc, f) => new Func<object, bool>(o => acc(o) && f(o)));
此重载要求序列非空,但您可以为累加器提供初始值:
Func<object, bool> folded = funcs.Aggregate(new Func<object, bool>(_ => true), (acc, f) => (o => acc(o) && f(o)));
于 2013-03-13T22:07:50.893 回答
0
我会这样做:
bool evaluateAllFuncs(object someObject)
{
IEnumerable<Func<object, bool>> funcs = GetAllFuncs();
return funcs.All(f => f(someObject)));
}
于 2013-03-13T22:01:34.843 回答