Mic*_*man 8 linq vb.net algorithm combinations
我想函数生成来自n个元素的List的所有元素的k组合.请注意,我正在寻找组合,而不是排列,并且我们需要一个改变k的解决方案(即,对循环进行硬编码是禁止的).
我正在寻找一个优雅的解决方案,b)可以用VB10/.Net 4.0编码.
这意味着a)需要LINQ的解决方案是可以的,b)使用C#"yield"命令的解决方案不是.
组合的顺序并不重要(例如,词典编纂,格雷码,什么是你),如果两者发生冲突,优雅优于表现.
(OCaml的和C#解决方案,这里将是完美的,如果他们能在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;
}
}
Run Code Online (Sandbox Code Playgroud)
此处使用的集合初始化程序语法在VB 2010(源代码)中可用.