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

この拡張機能をパラメーターとして使用できるようにしたいと考えています。たとえば、次のようなものを書きたいと思います。

         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」は明確に定義された型ではありません。私は代理人を作成しようとしました:

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

しかし、うまくいきません。誰かが私を助けることができますか?どうもありがとう!

4

2 に答える 2

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 を別のラムダにラップします

matrix.ApplyExtension(vector => vector.IsNaN());
于 2013-05-29T14:34:49.753 に答える
0

デリゲートは、提供されたメソッドが拡張メソッドであることを認識したり気にしたりする必要はありません。提供されたメソッドを強制的に拡張メソッドにすることもできません。

拡張メソッドは、内部的には別の静的メソッドです。それに応じてそれを踏みます:

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

次に、次のように呼び出します。

myMatrix.Apply(VectorExtensions.SomeOperation);
于 2013-05-29T14:34:51.053 に答える