2017-01-28 7 views
0

Возможно, переопределение здесь не является правильным термином. Я хочу расширить некоторые функции класса System.Math для работы с двойными массивами.Переопределение многих функций класса одновременно с C#

То, что я сейчас делаю это:

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

Для многих функций в математике (около 20), просто заменяя грешат Cos, круглые, ...

Есть ли способ сделать это более элегантно?

Обратите внимание: я создаю что-то, что позволит пользователю оценивать выражения во время выполнения. Пользователь должен уметь записывать «Cos (d)» для двоичного массива 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 Transform(double[] values, Func<double, double> transformation) 
{ 
    for(int i = 0; i < values.Length; i++) 
     values[i] = transformation[values[i]]; 
} 

Теперь вы можете использовать более конкретные методы, как

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

Вы могли бы использовать Методы расширения:

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

И тогда вызов будет:

var f = d.Sin(); 

Примечание: Это не получить синтаксис, который вы хотели, а также не решает вопрос о необходимости написать один из них для каждого из соответствующие математические методы, но я отправлю его здесь в качестве ответа на вопрос о том, как расширить существующие методы более элегантно.

+0

Это довольно аккуратно! Благодарю. – AsaridBeck91

+0

Как бы это обобщить функцию из 2 входов? Например, Log (number, base) для result = d.Log (base) – AsaridBeck91

+0

Вы можете добавить больше параметров, без проблем, только первый имеет 'this' на нем. –

Смежные вопросы