2013-05-29 105 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);