c# - 需要幂集/子集组合的算法,但仅适用于固定数量的元素

c# - Algorithm for Power Set / Sub-Set combinations required, but only for a fixed number of elements

好的,

这是这个问题的扩展-列表中的超级集合:

Getting all possible combinations from a list of numbers

这有帮助,但是 returns 所有子集: http://rosettacode.org/wiki/Power_set#C.23

但我需要的是只检索具有固定数量的子集。 IE。假设我的列表是数字的集合:

1 2个 3个 4个 5个 6

我只想要 4 个数字的不同组合,即 1,2,3,4 1,2,3,5 1,2,3,6 1,3,4,5 1,3,4,6 1,4,5,6 2,3,4,5 2,3,4,6 2,4,5,6 3,4,5,6

我以数字为例,但在我的解决方案中,我正在处理其他类型的对象。

我 100% 确定这对于知道的人来说很容易解决....

提前致谢

假设您总是想要 4,使用嵌套 for 循环编写该算法相对容易。

var set = new[] {1, 2, 3, 4, 5, 6};

for (int firstIndex = 0; firstIndex < set.Length; firstIndex++)
{
    for (int secondIndex = firstIndex+1; secondIndex < set.Length; secondIndex++)
    {
        for (int thirdIndex = secondIndex+1; thirdIndex < set.Length; thirdIndex++)
        {
            for (int fourthIndex = thirdIndex+1; fourthIndex < set.Length; fourthIndex++)
            {
                Console.WriteLine(string.Format($"{set[firstIndex]}, {set[secondIndex]}, {set[thirdIndex]}, {set[fourthIndex]}"));
            }
        }
    }
}

如果您需要它是动态的并支持不同的列表大小(即它并不总是 4 个),那么将其转换为递归 N 次的递归调用可能更容易。

您可以通过过滤结果的长度来扩展您引用的解决方案

public IEnumerable<IEnumerable<T>> GetPowerSetOfLength<T>(List<T> list, int length)
{
    return from m in Enumerable.Range(0, 1 << list.Count)
              //because doing a count will iterate through the enumerable 
              //better to just convert it to a list up front 
              let setResult = ( from i in Enumerable.Range(0, list.Count)
                                where (m & (1 << i)) != 0
                                select list[i]).ToList()
              where setResult.Count==length
              select setResult;
}

这里有一个 link to a dot net fiddle 正在使用此代码,如果您想对其进行测试