Звучит так, будто вы хотите, чтобы функциональные языки называли «карри» или «частичное применение».
Учитывая Func<a, b, c, d, x, result>
, вы применяете значения одно за другим и уменьшаете набор параметров.
Func<a, b, c, d, x, result>(valueOfA)
приведет к функции с подписью
Func<b, c, d, x, result>
, который вы можете передать.
Соответствующие ссылки для карри / частичного применения в C #:
Или - попробуйте F #;)
Редактировать: Образец краткого кода, созданный из ссылочных сайтов выше:
Код котельной:
public static Func<B, R> Partial<A, B, R>(this Func<A, B, R> f, A a) {
return b => f(a, b);
}
public static Func<B, C, R> Partial<A, B, C, R>(this Func<A, B, C, R> f, A a) {
return (b, c) => f(a, b, c);
}
public static Func<B, C, D, R> Partial<A, B, C, D, R>(this Func<A, B, C, D, R> f, A a) {
return (b, c, d) => f(a, b, c, d);
}
Ваш код:
Func<double, double, double, double, double> yourCalculation = (a, b, c, x) => a*Math.Pow(x, 3) + b*Math.Pow(x, 2) + c*x;
var aDefined = yourCalculation.Partial(12);
var bDefined = aDefined.Partial(13);
var cDefined = bDefined.Partial(14);
cDefined - теперь новый Func, который «знает» предварительно примененные значения и может быть передан как вам угодно. Я не смог найти готовое решение для делегатов с более чем 4 параметрами (т.е. вещи, которые не соответствуют Func <...>), но это также должно быть возможно.
Таким образом, вы рассчитываете один раз точно так же, как и сегодня, но вы можете сузить функцию до последней части для каждого потребителя.