如何转换Func <vector <double>,double&gt;到Func <double [],double =“”>

时间:2017-09-19 13:15:25

标签: c# reflection delegates type-conversion

我正在尝试将Func<MathNet.Numerics.LinearAlgebra.Vector<double>, double>转换为Func<double[], double>,但无法找到方法。

我需要做的原因是:我在第一种形式中得到一个参数,我必须以第二种形式传递它。基本上,我必须将Vector中的每个double值映射到double数组中的double值。

有没有办法进行这种转换,也许是用反射?

编辑:

Vector<T>是抽象的。

DenseVector<T>是实现Vector<T>

的类之一

使用double[]初始化矢量初始化:

new DenseVector(new double [] { });

1 个答案:

答案 0 :(得分:2)

如果阵列很大并且从中创建Vector是很昂贵的,这可能不是一个好的解决方案,但它很容易找到它。

最好只用double[]重写一大块Vector<double>代码,以避免一直来回转换。我对你的代码知之甚少,不知道哪种解决方案更合适,但是如果所有这些与构造函数混在一起使你的代码瘫痪,那么这种方法是一个不错的选择。

using MathNet.Numerics.LinearAlgebra;

// ...stuff...

Func<Vector<double>, double> fv /*coming from somewhere */;

Func<double[], double> fa = (ary) => fv(new DenseVector<double>(ary));

将一种lambda类型转换为另一种lambda类型的未来并不多,但您可以随时使用适当的转换或转换代码进行一次调用

如果你需要同样“转换”Vector<double> lambdas数组,这应该可行:

Func<Vector<double>, double>[] fva /*coming from somewhere */;

Func<double[], double>[] fda = 
    fva.Select(fv => 
        new Func<double[], double>>(ary => fv(new DenseVector<double>(ary))
    ).ToArray();

或者饶恕我可怜的心灵解析器:

public Func<T[], T> ConvertVectorToArrayFunc<T>(Func<Vector<T>, T> f)
    => a => f(new DenseVector<T>(a));

// ... snip ...

    Func<double[], double> fa = ConvertVectorToArrayFunc(fv);

    Func<double[], double>[] fda =
        fva.Select(ConvertVectorToArrayFunc).ToArray();