一尘不染

如何生成列表元素的组合 在.NET 4.0中

algorithm

我有一个与此处回答的问题相似但不完全相同的问题。

我想要一个函数从n个元素的列表中生成元素的所有 k个 组合。请注意,我在寻找组合,而不是排列,并且我们需要一种用于改变 k
的解决方案(即,对循环进行硬编码是不行的)。

我正在寻找a)优雅的解决方案,并且b)可以在VB10 / .Net 4.0中进行编码。

这意味着a)需要LINQ的解决方案是可以的,b)使用C#“ yield”命令的解决方案是不可行的。

组合的顺序并不重要(例如,字典编排,格雷码,您拥有什么),并且如果两者存在冲突,则应优先考虑优雅而不是性能。

(如果可以在VB10中进行编码,那么这里的OCaml和C#解决方案将是完美的。)


阅读 190

收藏
2020-07-28

共1个答案

一尘不染

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中提供了此处使用的集合初始化器语法()。

2020-07-28