在C#中使用灵活维度定义Func

时间:2016-03-28 22:45:02

标签: c# func

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

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

    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,这似乎有些过分。让我提一下,它不一定总是产品,而是总是一些易于在维度上推广的同质表达式。

2 个答案:

答案 0 :(得分:4)

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

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

输出“10”

答案 1 :(得分:2)

正如已经在其他地方提到并发布的那样,Enumerable类有许多方法可以让你在集合中应用func ,聚合就是一个例子。但是,根据您尝试使用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和一个双精度数组,以及一个init值(产品大于1,添加0)。