我有一个与回答 here. 的问题相似但不完全相同的问题
我想要一个函数从 n 个元素的列表中生成所有 k 元素组合。请注意,我正在寻找组合,而不是排列,并且我们需要针对不同的 k 的解决方案(即,对循环进行硬编码是不行的)。
我正在寻找 a) 优雅 b) 可以在 VB10/.Net 4.0 中编码的解决方案。
这意味着 a) 需要 LINQ 的解决方案没问题,b) 使用 C#“yield”命令的解决方案不行。
组合的顺序并不重要(即,字典序、格雷码、你有什么),如果两者发生冲突,优雅优先于性能。
(OCaml 和 C# 解决方案 here 将是完美的,如果它们可以在 VB10 中编码。)
最佳答案
C# 中的代码将组合列表生成为 k 元素的数组:
public static class ListExtensions
{
public static IEnumerable<T[]> Combinations<T>(this IEnumerable<T> elements, int k)
{
List<T[]> result = new List<T[]>();
if (k == 0)
{
// single combination: empty set
result.Add(new T[0]);
}
else
{
int current = 1;
foreach (T element in elements)
{
// combine each element with (k - 1)-combinations of subsequent elements
result.AddRange(elements
.Skip(current++)
.Combinations(k - 1)
.Select(combination => (new T[] { element }).Concat(combination).ToArray())
);
}
}
return result;
}
}
此处使用的集合初始化器语法在 VB 2010 中可用 (source)。
关于vb.net - 如何在 .NET 4.0 中生成 List<T> 的元素组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1119699/