C#:有没有办法通过指定额外参数的值来 "trim" 一个函数来适应委托?

C#: Is there any way to "trim" a function to fit into a delegate by specifying the values of extra arguments?

我正在从事一个经常通过委托将函数作为参数传递的项目。 示例:

delegate double MathFunction(double x);
void render_function(double x0, double x1, double x_interval, MathFunction f)
{...}

我 运行 遇到的一个常见情况是想要传递一个具有附加参数的函数,我希望每次在 render_function 中调用它时它都有一个常量值。但我不想只删除参数并将它们替换为常量,因为我多次调用 render_function 并为这些参数设置不同的值。

我想做的事情的例子:

double sin_wave(double x, double frequency, double magnitude) {...}

render_function(x0, x1, x_interval, sin_wave(frequency: 3, magnitude: 0.5));
render_function(x0, x1, x_interval, sin_wave(frequency: 2, magnitude: 1.5));

我想到了几个解决方案:

但我觉得这两个都不雅观。有没有更清洁的解决方案?

您可以将其包装在 lambda 中:

render_function(x0, x1, x_interval, x => sin_wave(x, frequency: 3, magnitude: 0.5));

如果您不介意手写所有内容,直接的方法是定义一个 class 实例来保存缓存的参数并为您调用该方法;

public class Sin {
    private readonly double frequency;
    private readonly double magnitude;
    public Sin(double frequency, double magnitude) {
        this.frequency = frequency;
        this.magnitude = magnitude; 
    }
    public double Call(double x) => sin_wave(x, frequency, magnitude);
}
MathFunction func = new Sin(3, ...).Call;

但是您可以让 C# 编译器为您构建与上述等同的东西;

MathFunction func = Sin(double frequency, double magnitude)
    => (x) => sin_wave(x, frequency, magnitude);

或者直接构建委托;

MathFunction func = (x) => sin_wave(x, 3, 0.5);