2017-01-28 16 views
0

ここでは、オーバーライドが正しい用語ではない場合があります。 System.Mathクラスのいくつかの関数を拡張して、double配列を処理したいと考えています。クラスの多くの関数をC#で一度にオーバーライドする

私が現在やっていることです:数学(約20)コス、ラウンド、でわずか交換罪で多くの機能については

public double[] Sin(double[] d) 
{ 
double[] result = new double[d.Length]; 
for(int i=0;i<result.Length;i++) 
    result[i] = Math.Sin(d[i]); 
} 

...

は作るための方法はありますこれはよりエレガントですか?

私はユーザーが実行時に式を評価できるようにするために何かを構築しています。 ユーザは、d倍配列とすべての関数に対して "Cos(d)"を書くことができる必要があります。そのため、入力側のソリューションは本当にオプションではありません。

本当に感謝すべて

+2

なぜ車輪を改造するのですか? 'double [] result = d.Select(Math.Sin).ToArray();' –

+0

私は誰かがそれを行うことができるのか知らなかった。それは物事をはるかに短くします。ありがとう。 – AsaridBeck91

答えて

2

ないが、あなたはArray.ConvertAllでそれを短縮することができます。

double[] result = Array.ConvertAll(d, Math.Sin); 

関数名が文字列である場合、あなたは辞書を使用することができるかもしれない:

var dict = new Dictionary<string, Func<double[], double[]>> { 
    { "Sin", a => Array.ConvertAll(a, Math.Sin) }, 
    { "Cos", a => Array.ConvertAll(a, Math.Cos) } 
}; 

double[] d = { 1, 2 }; 
double[] result = dict["Sin"](d);   // { 0.8414709848078965, 0.90929742682568171 } 
0

より一般的な方法を作成して、アレイで作業することができます。今、あなたは

internal static void Sin(doube[] values) 
{ 
    return Transform(values, Math.Sin); 
} 

それとも

internal static void Cos(doube[] values) 
{ 
    return Transform(values, Math.Cos); 
} 

ような、より具体的な方法を使用することができます使用量はあなたが使用することができ、この

var result = Sin(values) 
0

のようになります。この

internal static void Transform(double[] values, Func<double, double> transformation) 
{ 
    for(int i = 0; i < values.Length; i++) 
     values[i] = transformation[values[i]]; 
} 

ような何か拡張方法:

public static class MathExtensions 
{ 
    public static double[] Sin(this double[] input) 
    { 
     return input.Select(Math.Sin).ToArray(); 
    } 
} 

そしてコールは次のようになります。

var f = d.Sin(); 

注:これは、あなたが望んでいた構文を取得していない、またそれは、のそれぞれについて、これらのいずれかを記述することの問題を解決しません対応するMathメソッドについて説明しますが、既存のメソッドをよりエレガントに拡張する方法の答えとしてここに投稿します。

+0

それはかなりきれいです!ありがとう。 – AsaridBeck91

+0

これは2入力の関数にどのように一般化されますか?たとえば、結果= d.Log(ベース)のログ(数値、ベース) – AsaridBeck91

+0

パラメータを追加することはできますが、問題はありません。最初のものだけに 'this'があります。 –

関連する問題