我想创建一个方法,它能够使用我在Vector类(MathNet)上创建的几个扩展。例如,我有Vector扩展名:
public static bool IsNaN(this Vector<double> m)
{
int i = Array.IndexOf(m.ToArray(), double.NaN);
bool b = (i == -1);
b = !b;
return b;
}
我希望能够使用此扩展作为参数。例如,我想写一些类似的东西:
public static Vector<double> ApplyExtension(this Matrix<double> x, VectorExtension myOperation)
{
Vector<double> res = new DenseVector(x.ColumnCount, 0);
for (int i = 0; i < x.ColumnCount; i++)
{
res[i] = x.Row(i).myOperation();
}
return res;
}
当然,&#34; VectorExtension&#34;不是一个明确定义的类型。我试图创建一个删除:
public delegate double VectorExtension(this Vector<double> d);
但是,它不起作用。有人能帮助我吗?非常感谢!
答案 0 :(得分:2)
public static Vector<TResult> ApplyExtension<T, TResult>(this Matrix<T> x, Func<Vector<T>, TResult> myOperation)
{
var res = new DenseVector(x.ColumnCount, 0);
for (int i = 0; i < x.ColumnCount; i++)
{
res[i] = myOperation(x.Row(i));
}
return res;
}
现在您可以使用方法组语法
matrix.ApplyExtension(VectorExtensions.IsNaN);
或将cal包装成另一个lambda
matrix.ApplyExtension(vector => vector.IsNaN());
答案 1 :(得分:0)
代表不需要知道或关心提供给它的方法是扩展方法。您无法强制提供给它的方法作为扩展方法。
扩展方法在引擎盖下只是另一种静态方法;相应地说:
public static Vector<double> Apply(this Matrix<double> x
, Func<Vector<double>, double> myOperation)
{ }
然后你可以这样称呼它:
myMatrix.Apply(VectorExtensions.SomeOperation);