3

私が持っているとしましょうIEnumerable<Func<object, bool>>Func<object, bool>そのリストのすべての関数が何らかのオブジェクトで呼び出されたときに true を返す場合、true を返すnew を作成したいと思います。つまり、関数のリストを集約 (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

Jon が指摘するように、最善の方法は を使用すること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 に答える