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