您想要的操作称为“部分评估”;它在逻辑上与将一个二参数函数“柯里化”为两个一参数函数有关。
static class Extensions
{
static Func<A, R> PartiallyEvaluateRight<A, B, R>(this Func<A, B, R> f, B b)
{
return a => f(a, b);
}
}
...
Func<int, int, bool> isGreater = (x, y) => x > y;
Func<int, bool> isGreaterThanTwo = isGreater.PartiallyEvaluateRight(2);
现在您可以isGreaterThanTwo
在where
子句中使用。
如果您想提供第一个参数,那么您可以轻松编写PartiallyEvaluateLeft
.
有道理?
柯里化操作(部分适用于左边)通常写成:
static class Extensions
{
static Func<A, Func<B, R>> Curry<A, B, R>(this Func<A, B, R> f)
{
return a => b => f(a, b);
}
}
现在你可以创建一个工厂:
Func<int, int, bool> greaterThan = (x, y) => x > y;
Func<int, Func<int, bool>> factory = greaterThan.Curry();
Func<int, bool> withTwo = factory(2); // makes y => 2 > y
这一切都清楚了吗?