C# 根据数组大小和参数数量确定要调用的方法

C# 根据数组大小和参数数量确定要调用的方法,c#,.net,arrays,algorithm,overloading,C#,.net,Arrays,Algorithm,Overloading,我有一个繁重的计算算法,我必须完成。为了使它尽可能高效,我根据参数的数量将它分为五种方法。这让我尽可能节约。也就是说,我不希望我的用户意识到这一点 public AnalysisResult[] PerformAnalysis(double[] Inputs, double[] Outputs, int[][] Coefficients) { AnalysisResult[] AR = new AnalysisResult[Coefficients.Length]; for (

我有一个繁重的计算算法,我必须完成。为了使它尽可能高效,我根据参数的数量将它分为五种方法。这让我尽可能节约。也就是说,我不希望我的用户意识到这一点

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
}

首先,在循环中多次使用系数[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);
    }
}

这是假设你真的想为不同的情况保留不同的方法,这是问题中的假设。

好吧,事实上,你在循环中多次使用系数[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);
    }
}

这是假设您确实希望为不同的情况保留不同的方法,这是问题中的假设。

如果您愿意,您可以使用反射:

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

如果愿意,可以使用反射:

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

我认为,根据参数的数量,这些方法的行为会有所不同?开关很好,很干净。如果您需要坚持使用一个公共方法来获取一个数组,那么没有理由进行任何更改。我认为这些方法的行为会因参数数量的不同而有所不同?switch很好而且干净。如果您需要坚持使用单个公共方法来获取数组数组,那么没有理由进行任何更改。在java中这很容易,因为JDK5提供了var args,称为变量参数。因此,您的方法可能类似于private AnalysisResult GetResultint。。。input@AKS:C具有相同的功能-它将是GetResultparams int[]输入。但是OP希望针对不同的情况有不同的方法,这在java中很容易,因为JDK5提供了var args,称为变量参数。因此,您的方法可能类似于private AnalysisResult GetResultint。。。input@AKS:C具有相同的功能-它将是GetResultparams int[]输入。但是OP希望针对不同的情况有不同的方法。