我有一个与
here.回答相似但不完全相同的问题
我想一个函数从n个元素的List中生成所有元素的k组合.注意,我正在寻找组合,而不是排列,并且我们需要一种变化k的解决方案(即,对循环进行硬编码是禁止的).
我正在寻找一个优雅的解决方案,b)可以用VB10 / .Net 4.0编码.
这意味着a)需要LINQ的解决方案是可以的,b)使用C#“yield”命令的解决方案不是.
组合的顺序并不重要(例如,词典编纂,格雷码,什么是你),如果两者发生冲突,优雅优于表现.
C#中的代码,它生成组合列表作为k个元素的数组:
原文链接:https://www.f2er.com/vb/255494.htmlpublic 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)中可用.