使用C#一次覆盖类的许多函数

时间:2017-01-28 20:45:52

标签: c#

也许压倒一切并不是这里的正确用语。 我想扩展一些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数组和所有函数,所以来自输入端的解决方案实际上不是一个选项。

全部谢谢

3 个答案:

答案 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();

注意:这并没有得到你想要的语法,也没有解决为每个相应的数学方法编写其中一个的问题,但我会在这里发布为如何更优雅地扩展现有方法的答案。