在C#中运行一系列值的所有可能组合

时间:2017-08-04 16:00:16

标签: c# loops iteration

我有一个参数类,其中包含一系列不同值的属性(从最小到最大)

class Parameter
{
    public int Min { get; set; }
    public int Max { get; set; }
    public int Value { get; set; }
}

然后我有一个参数列表,例如:

    var Params = new List<Parameter>();
    Params.Add(new Parameter { Min = 7, Max = 12, Value = 9 });
    Params.Add(new Parameter { Min = 18, Max = 24, Value = 21 });
    Params.Add(new Parameter { Min = 49, Max = 60, Value = 54 });

我的问题是我需要运行一些代码,其中包含每个参数值的所有可能组合(例如,将参数1的值设置为7,8,...到12)。

我还需要代码来处理列表中未定义数量的参数(在此示例中,只有3个,但可能会有更多)。显然,随着列表中参数的数量,工作量将呈指数级增长

我假设我需要某种递归功能。有人对最佳方法有任何建议吗?

3 个答案:

答案 0 :(得分:1)

有没有理由你不能做一个简单的foreach循环?

foreach (Parameter param in Params)
{
   DoCalculation(param)
}

然后你的函数看起来像这样的for循环

public void DoCalculation (Parameter param)
{
   for (int i = param.Min; i <= param.Max; i++)
   {
      param.Value = i;
      //Do Calculation necessary
   }
}

答案 1 :(得分:0)

你有params列表,所以从那开始 使用foreach循环,这是算法

For each parameter
    start from min and increment by one untill you reach max
         assign to value to perform function 
         (code or function to run with value as param here)
    finish this loop (it can be while or for loop)
finish this loop (for each loop in c# would do)

试试这个并告诉我们。从你的问题来看,到目前为止你所尝试的并不清楚。我的回答是基于你到目前为止提供的内容。

答案 2 :(得分:0)

您可以使用这样的递归函数:

public static void IterateParams(Parameter[] parameters, int depth = 0)
{
    // If we had iterated each parameter
    if (depth == parameters.Length)
    {
        // Then do something with values, for example print it
        int[] values = parameters.Select(p => p.Value).ToArray();
        Console.WriteLine(string.Join(", ", values));
    }
    else // Else iterate through the values of the next parameter
    {
        var parameter = parameters[depth];

        for (int i = parameter.Min; i <= parameter.Max; i++)
        {
            parameter.Value = i;
            IterateParams(parameters, depth + 1);
        }
    }
}

public static void Main()
{
    var Params = new List<Parameter>();
    Params.Add(new Parameter { Min = 7, Max = 12, Value = 9 });
    Params.Add(new Parameter { Min = 18, Max = 24, Value = 21 });
    Params.Add(new Parameter { Min = 49, Max = 60, Value = 54 });

    IterateParams(Params.ToArray());
}