【问题标题】:Get all parameters combinations possible获取所有可能的参数组合
【发布时间】:2011-11-16 21:18:38
【问题描述】:

我有一个可能值的参数列表:

// Definition of a parameter
public class prmMatrix
{
    public string Name { get; set; }
    public List<string> PossibleValues { get; set; }

    public prmMatrix(string name, List<string> values)
    {
        Name = name;
        PossibleValues = values;
    }
}

//[...]

// List of params       
List<prmMatrix> lstParams = new List<prmMatrix>();

lstParams.Add(new prmMatrix("Option A", new List<string>() { "Yes", "No" }));
lstParams.Add(new prmMatrix("Option B", new List<string>() { "Positive", "Negative" }));

我想要所有可能的参数组合,例如:

[Option A:Yes][Option B:Positive]
[Option A:Yes][Option B:Negative]
[Option A:No][Option B:Positive]
[Option A:No][Option B:Negative]

C# 中最好的方法是什么?

【问题讨论】:

标签: c# permutation combinations


【解决方案1】:

使用递归很容易:

void ImplCombinations(List<prmMatrix> plist, string built, int depth, List<string> results)
{
    if (depth >= plist.Count()) {
        results.Add(built);
        return;
    }

    prmMatrix next = plist[depth];
    built += "[" + next.Name + ":";
    foreach (var option in next.PossibleValues)
        ImplCombinations(plist, built + option + "]", depth + 1, results);
}

List<string> GetCombinations(List<prmMatrix> plist)
{
    List<string> results = new List<string>();
    ImplCombinations(plist, "", 0, results);
    return results;
}

【讨论】:

    【解决方案2】:

    使用Cross Join 获取数据集之间的笛卡尔积。这可以使用 LINQ 轻松完成。例如

    var lstValues = new List<string>() { "Yes", "No" };
    var lstValues2 = new List<string>() { "Positive", "Negative" };
    
    var crossJoinQuery =
       from a in lstValues
       from b in lstValues2
       select new { a, b };
    
    foreach (var o in crossJoinQuery)
    {
       Console.WriteLine(string.Format("{0},{1}", o.a , o.b));
    }
    

    这将为您提供所有值的组合。然后,您可以对结果集做任何您想做的事情。

    【讨论】:

    • 我也是这么想的,但后来我重新阅读了这个问题,意识到这两个列表在编译时是未知的......有一个列表列表。
    【解决方案3】:
    list<item> recurseMe(list<category> parameters, item building)
    {
      if (parameters.isEmpty())
      {
        return item;
      }
      category param = parameters[0];
      list<item> ret = new list<item>();
      for(int i = 0; i < param.possibleValues; i++)
      {
        ret.add(recurseMe(parameters without param, item with param[i]);
      }
      return ret;
    }
    

    类别将是您项目的一个参数,并包含它的所有可能值。

    【讨论】:

      【解决方案4】:

      那么递归时间。

      private prmMatrix[] _allParams;
      private List<String> _allCombos;
      
      public List<String> EnumarateAllCombinations()
      {
         _allCombos = new List<String>();
         EnumParams(0, "");
         return _allCombos;
      }
      
      private void EnumParams(int paramNum, string paramValues)
      {
          if(paramNum >= allParams.Length)
          {
              _allCombos.add(paramValues);
          }
          else
          {
              prmMatrix current = _allParams[paramNum];
              foreach(string val in current.PossibleValues)
                  EnumParams(paramNum+1, paramValues + "[" + val + "]");
          }
       }
      }
      

      【讨论】:

      • 看起来@Ben Voigt 比你领先一分钟 :)
      • 我也经常在手机上这样做:)
      【解决方案5】:

      我的建议是:

      foreach (var optionA in lstValues)
      {
          foreach (var optionB in lstValues2)
          {
              // Do someting
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-06
        • 2022-01-23
        • 1970-01-01
        • 2012-03-20
        • 2017-09-18
        • 2011-05-16
        • 1970-01-01
        相关资源
        最近更新 更多