也许压倒一切并不是这里的正确用语。 我想扩展一些System.Math类函数来处理双数组。
我目前正在做的是:
public double[] Sin(double[] d)
{
double[] result = new double[d.Length];
for(int i=0;i<result.Length;i++)
result[i] = Math.Sin(d[i]);
}
对于数学中的许多函数(大约20个),只用Cos替换Sin,Round,......
有没有办法让这更优雅?
请注意,我正在构建一些允许用户在运行时计算表达式的东西。 用户需要能够写出&#34; Cos(d)&#34;对于d double数组和所有函数,所以来自输入端的解决方案实际上不是一个选项。
全部谢谢
答案 0 :(得分:2)
不是,但您可以使用Array.ConvertAll
缩短它:
double[] result = Array.ConvertAll(d, Math.Sin);
如果函数名称在字符串中,您可以使用字典:
var dict = new Dictionary<string, Func<double[], double[]>> {
{ "Sin", a => Array.ConvertAll(a, Math.Sin) },
{ "Cos", a => Array.ConvertAll(a, Math.Cos) }
};
double[] d = { 1, 2 };
double[] result = dict["Sin"](d); // { 0.8414709848078965, 0.90929742682568171 }
答案 1 :(得分:0)
您可以创建更通用的方法来处理数组。像这样的东西
internal static void Transform(double[] values, Func<double, double> transformation)
{
for(int i = 0; i < values.Length; i++)
values[i] = transformation[values[i]];
}
现在你可以使用更具体的方法,比如
internal static void Sin(doube[] values)
{
return Transform(values, Math.Sin);
}
或者
internal static void Cos(doube[] values)
{
return Transform(values, Math.Cos);
}
用法将是这样的
var result = Sin(values)
答案 2 :(得分:0)
您可以使用扩展方法:
public static class MathExtensions
{
public static double[] Sin(this double[] input)
{
return input.Select(Math.Sin).ToArray();
}
}
然后电话会是:
var f = d.Sin();
注意:这并没有得到你想要的语法,也没有解决为每个相应的数学方法编写其中一个的问题,但我会在这里发布为如何更优雅地扩展现有方法的答案。