簡體   English   中英

如何使用linq將委托聚合為新的委托

[英]How to aggregate delegates into a new delegate with linq

假設我有IEnumerable<Func<object, bool>> 我想創建一個新的Func<object, bool> ,如果在某個對象上調用該列表的每個函數都返回true時,該函數應該返回true。 換句話說,我想聚合(減少\\ foldl)功能列表。

像這樣做:

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

正如喬恩指出的,最好的方法是使用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)));

我會這樣做:

bool evaluateAllFuncs(object someObject)
{
    IEnumerable<Func<object, bool>> funcs = GetAllFuncs();
    return funcs.All(f => f(someObject)));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM