3

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

4

3 回答 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 回答