我有一个重要的计算算法,我必须完成。为了使其尽可能高效,我根据参数的数量将其分为五种方法。这使我能够尽可能地节约开支。也就是说,我不希望我的用户意识到这一点。
public AnalysisResult[] PerformAnalysis(double[] Inputs, double[] Outputs, int[][] Coefficients)
{
AnalysisResult[] AR = new AnalysisResult[Coefficients.Length];
for (int i = 0; i < Coefficients.Length; i++)
AR[i] = GetResults(Inputs, Outputs, /* Based on length of Coefficients[i]*/ );
return AR;
}
private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A)
{
// Do stuff
}
private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B)
{
// Do stuff
}
private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B, int C)
{
// Do stuff
}
private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B, int C, int D)
{
// Do stuff
}
private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B, int C, int D, int E)
{
// Do stuff
}
正如您所看到的,我希望用户只能使用一种公共方法来调用算法。我想知道是否有一种简单的方法可以根据传递给PerformAnalysis
的数组的长度来确定调用哪个私有方法?
有什么建议吗?
到目前为止,我的方法是基于数组长度的switch语句,但我认为有更好的方法。
public AnalysisResult[] PerformAnalysis(double[] Inputs, double[] Outputs, int[][] Coefficients)
{
AnalysisResult[] AR = new AnalysisResult[Coefficients.Length];
for (int i = 0; i < Coefficients.Length; i++)
switch (Coefficients[i].Length)
{
case 1:
AR[i] = GetResults(Inputs, Outputs, Coefficients[i][0]);
break;
case 2:
AR[i] = GetResults(Inputs, Outputs, Coefficients[i][0], Coefficients[i][1]);
break;
// Etc
}
return AR;
}
答案 0 :(得分:4)
好吧,你在循环中多次使用Coefficients[i]
的事实对我来说感觉很痛苦,首先。我将做的第一次重构将是:
// Names changed to fit .NET conventions
public AnalysisResult[] PerformAnalysis(int[][] coefficients)
{
return Array.ConvertAll(coefficients, GetResult);
}
private AnalysisResult GetResult(int[] input)
{
switch (input.Length)
{
case 1: return GetResult(input[0]);
case 2: return GetResult(input[0], input[1]);
case 3: return GetResult(input[0], input[1], input[2]);
case 4: return GetResult(input[0], input[1], input[2], input[3]);
case 5: return GetResult(input[0], input[1], input[2], input[3], input[4]);
default:
throw new ArgumentException("Invalid number of inputs: " + input.Length);
}
}
假设你真的想为不同的案例保留不同的方法,这就是问题中的假设。
答案 1 :(得分:1)
如果您愿意,可以使用反射:
for (int i = 0; i < Coefficients.Length; i++) {
// Get all private methods named GetResults with a number of parameters equal to Cofficients[i].Length
var methodToCall = this.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).Where(mi => mi.Name == "GetResults" && mi.GetParameters().Count() == Coefficients[i].Length);
// Invoke that method via reflection
AR[i] = methodToCall.Invoke(this, Cofficients[i]);
}