加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:18:38 所属栏目:大数据 来源:网络整理
导读:我有一个与 here.回答相似但不完全相同的问题 我想一个函数从n个元素的List中生成所有元素的k组合.注意,我正在寻找组合,而不是排列,并且我们需要一种变化k的解决方案(即,对循环进行硬编码是禁止的). 我正在寻找一个优雅的解决方案,b)可以用VB10 / .Net 4.0编
我有一个与 here.回答相似但不完全相同的问题

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

我正在寻找一个优雅的解决方案,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)中可用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读