在 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”
在 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”