我有类似的公式来计算哈特利变换.唯一的区别是输入函数 - sin,cos,exp在以下代码行中:
Math.Exp((double)tau)
Math.Sin((double)tau)
Math.Cos((double)tau)
Run Code Online (Sandbox Code Playgroud)
如何在以下片段中逃避几乎相同的代码片段并缩短我的代码?
private void CountHartley(ref double [] arr, string function)
{
int N = arr.Length;
if (function == "exp")
{
for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
{
arr[nu] = 1 / (double)N *
Math.Exp((double)tau) *
(Math.Sin(2 * Math.PI * nu * tau / (double) N) +
Math.Cos(2 * Math.PI * nu * tau / (double) N));
}
}
else if (function == "sin")
{
for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
{
arr[nu] = 1 / (double)N *
Math.Sin((double)tau) *
(Math.Sin(2 * Math.PI * nu * tau / (double)N) +
Math.Cos(2 * Math.PI * nu * tau / (double)N));
}
}
else
{
for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
{
arr[nu] = 1 / (double)N *
Math.Cos((double)tau) *
(Math.Sin(2 * Math.PI * nu * tau / (double)N) +
Math.Cos(2 * Math.PI * nu * tau / (double)N));
}
}
}
Run Code Online (Sandbox Code Playgroud)
string您可以直接传递函数,而不是使用要使用的函数.
您可以使用Func <T,TResult> Delegate,如下所示:
private void CountHartley(ref double [] arr, Func<double, double> function)
{
int N = arr.Length;
for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
{
arr[nu] = 1 / (double)N *
function((double)tau) *
(Math.Sin(2 * Math.PI * nu * tau / (double) N) +
Math.Cos(2 * Math.PI * nu * tau / (double) N));
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
var result = CountHartley(arr, Math.Cos);
Run Code Online (Sandbox Code Playgroud)