在 C# 中定义具有灵活维度的 Func

Defining a Func with flexible dimension in C#

C# 中,我想要一个 return 是 Func 的方法,但是 Func 的表达式取决于一些输入给定的维度。

例如,假设我希望函数 F 始终 return 其变量的乘积,但变量的数量可以变化。到目前为止我所做的如下:

    public static Func<double[],double> DefineFunction()
    {
        Func<double[], double> F = x => Prod(x);

        return F;
    }

    public static double Prod(double[] vector)
    {
        double result = 1;
        for (int i = 0; i<vector.Length; i++)
        {
            result *= vector[i];
        }
        return result;
    }

然后我可以定义一个函数来输出例如三个参数如下:

        Func<double[], double> G = DefineFunction();
        double test = G(new double[] { 1, 2, 3 });
        Console.WriteLine(test);

我的问题是这是否是最好的方法。我的方法使用另一种完整的方法来定义 F,这似乎有点矫枉过正。让我提一下,它不一定总是产品,而总是一些很容易跨维度概括的同质表达式。

正如已经在其他地方提到和发布的那样,Enumerable class 有许多方法允许您在集合中应用函数,聚合是一个例子。但是,按照您尝试使用 Func 并滚动您自己的应用程序的推理,您将如何构造它:

using System;

public class Program
{
    public static void Main(string[] args)
    {
        //define your general apply function
        Func<double[], Func<double, double, double>, double, double> G = (vars, func, init) =>
        {
            double result = init;
            foreach (var t in vars)
            {
                result = func(result,t);
            }

            return result;
        };

        //here is a product example    
        double test = G(new double[] { 1, 2, 3, 4 }, (prev, x) => prev * x, 1);
        Console.WriteLine(test);

        //here is an addition example
        test = G(new double[] { 1, 2, 3, 4 }, (prev, x) => prev + x, 0);
        Console.WriteLine(test);            
    }   
}

在上面,您可以传入任何函数或表达式,例如:(prev, x) => prev * x 和一个双精度数组,以及一个初始值(乘积大于 1,加法大于 0)。

已提供的代码有效。但正如前面提到的,Aggregate 完全符合您的要求。

Console.WriteLine(new double[] {1, 2, 3, 4}.Aggregate((x, y) => x + y));

输出“10”