我有一個參數列表,每個參數都接受特定範圍的輸入。我正在創建一個測試,每創建一個可能的有效輸入。此外,每個組都是可選的(可以完全跳過),所以組合長度不一定必須與列表長度相同。每組來自不同羣體的特定順序的組合
輸入
List<string[]> temp = new List<string[]>
{
// The order of these groups is important
new string[] { "a", "b", "c" },
new string[] { "d", "e" },
new string[] { "f", "g", "h" }
};
約束
- 0或1項(上方的
string[]
)的List<T>
的 - 順序必須保存
有效組合
a, e, f
a, d, g
c, e, f
b, g
c, f
無效組合
a, b, f
(a
和b
來自同一組 - 不允許)a, f, d
(錯誤的命令 -d
一定要來f
前)
到目前爲止,我已經回到我的圖書館,在那裏我有一個組合LINQ方法。
public static class IEnumerableExtensions
{
// Can be used to get all permutations at a certain level
// Source: http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n#1898744
public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k)
{
return k == 0 ? new[] { new T[0] } :
elements.SelectMany((e, i) =>
elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] { e }).Concat(c)));
}
}
在過去,我只用這個單個序列來做類似generate every permutation of URL segments的事情。但是我在使用嵌套列表時遇到了困難,每個組的約束條件都是按照特定的順序進行的。
我知道我可以通過做3個嵌套循環並使用列表來跟蹤哪些項目已經被使用,但我不知道List<T>
中有多少項目,所以不會在一般情況下工作。如何獲得上述輸入的所有有效組合?
我寧願LINQ,但會接受解決此問題的任何解決方案。
這需要一個遞歸函數。你可以從linq調用遞歸方法。遞歸的第一級將迭代「a,b,c」,.二級將遍歷「d,e」三級將遍歷「f,g,h」。 – jdweng
@jdweng - 你能舉一個例子嗎? – NightOwl888