vb.net - 如何在 .NET 4.0 中生成 List<T> 的元素组合

标签 vb.net linq algorithm combinations

我有一个与回答 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/

相关文章:

vb.net - 如何在 VB.Net 中自动对 Azure 信息保护的 Outlook 电子邮件敏感度进行分类?

c# - 使用 Linq 选择类的属性以返回 IEnumerable<T>

c# - 如何使用 linq 从列表中删除尾随对象?

algorithm - 递归 Tribonacci 序列时间复杂度

c++ - 查找从未排序的数组中删除的一个和 N 个元素

asp.net - 在 ASP.NET 中生成 Excel 文件

ASP.NET:TextBox.Text 没有更新的值

c# - VB 2008 将字符串 "08:30:00"转换为日期时间 "08:30:00"

c# - 是否可以使用 Linq To Entities 访问生成的 SQL

python - 如何将负位表示的数字转换为 python3 中的实际负 int 值?