5

我正在开发一个软件,它可以获取实时数据并根据用户输入从中提取一些特征。每个可用的特征都包含一个方法,该方法接受一个双精度数组并返回所需的特征,例如 MeanAbsoluteValue 的这个:

public static class MeanAbsoluteValue{
    public static double Calculate(double[] data){
        return data.Sum(s => Math.Abs(s)) / data.Length;
    }
}

由于每个功能都只有一个计算方法,我正在考虑尝试重写它们,以便可以从该集合中收集和选择它们。

我曾尝试编写一个接口供他们使用,但由于它们是静态的,因此这是不允许的。

有没有办法做到这一点?如果是这样,你能指出我正确的方向吗?

4

3 回答 3

8

Calculate您可以创建从这些类的方法构造的委托数组,如下所示:

Func<double[],double>[] array = new Func<double[],double>[] {
    MeanAbsoluteValue.Calculate
,   MeanValue.Calculate
,   Deviation.Calculate
//  ...and so on
};

这是关于 ideone 的演示

于 2013-04-15T14:06:12.433 回答
2

将代理存储在字典中,并按名称查找它们

 var methods = new Dictionary<string, Func<double[], double>>();
 methods.Add("MeanAbsoluteValue", MeanAbsoluteValue.Calculate);

 ...
 public double DoFunc(string name, double [] args)
 {
    var func = methods[name];
    return func(args);
 }
于 2013-04-15T14:09:54.810 回答
0

只需收集功能...

var list = new List<Func<double[], double>(MeanAbsoluteValue.Calculate, Average.Calculate)
var accum = 0;
foreach(var func in list)
{
    accum += func(new [] {1,3,4,});
}
于 2013-04-15T14:08:51.370 回答