2011-11-16 50 views
1

我有可能的值參數列表:獲取所有參數的組合可能

// 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#中的方式?

+0

可能重複(http://stackoverflow.com/questions/4319049/generating-permutations-using-linq) –

回答

4

這是遞歸很簡單:

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; 
} 
+0

謝謝:)這看起來不錯。 – ibiza

0

我的建議是:

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

使用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)); 
} 

這會給你所有值的組合。然後,您可以對結果集進行任何您想要的操作。

+1

這就是我的想法太多,但後來我重新閱讀這個問題並且意識到這兩個列表在編譯時是不知道的......有一個列表列表。 –

1
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; 
} 

一個類別將是你的項目的一個參數,幷包含所有可能的值。

1

遞歸時間,然後。 [使用LINQ生成排列組合]的

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

看起來像@Ben Voigt擊敗了你一分鐘:) –

+0

下次我不會使用iPad輸入代碼... – zmbq

+0

我一直在我的手機上也這樣做:) –