【发布时间】:2017-07-03 21:26:55
【问题描述】:
我有一个参数列表,每个参数都接受特定范围的输入。我正在创建一个创建每个可能的有效输入的测试。此外,每个组都是可选的(可以完全跳过),因此组合长度不必与列表的长度相同。
输入
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, fa, d, gc, e, fb, gc, f
无效组合
-
a, b, f(a和b来自同一组 - 不允许) -
a, f, d(顺序错误 -d必须在f之前)
到目前为止,我已经回到我的库,在那里我有一个 Combinations 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 - 你能举个例子吗?
标签: c# .net linq combinations