2013-05-29 99 views
0

我想创建一个能够使用在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; 
    } 

我希望能够使用此扩展AS A PARAMETER。例如,我想写一些类似于:

  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; 
    } 

当然,“VectorExtension”不是一个明确定义的类型。我试图创建一个deleguate:

public delegate double VectorExtension(this Vector<double> d); 

但是,它不起作用。有人能帮助我吗?非常感谢!

回答

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

有一些inconsistancies这里。你使它通用,但没有使用泛型参数。 'res'也是'Vector ',但返回类型是'Vector '。也许他们应该都是'Vector ',以及这个函数的参数? – Servy

+0

如果你想使它完全通用,看起来你需要泛型参数,'TSource'和'TResult',因为他在这里进行映射。 – Servy

+0

@Servy非常感谢您的评论。我将添加映射。首先,我认为他正在做一些扁平化。 OPs不一致也很难纠正。 –

0

委托并不需要知道或关心提供给它的方法是一种扩展方法。您提供给它的方法也不可能成为扩展方法。

扩展方法在引擎盖下是另一种静态方法;因此践踏:

public static Vector<double> Apply(this Matrix<double> x 
    , Func<Vector<double>, double> myOperation) 
{ } 

你可以这样调用它:

myMatrix.Apply(VectorExtensions.SomeOperation);