0

好的,

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

从数字列表中获取所有可能的组合

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

但我需要的是只检索具有固定数量的子集。即说我的列表是一组数字:

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

2 回答 2

0

假设您总是想要正好 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 次的递归调用可能更容易。

于 2016-07-13T21:53:09.047 回答
0

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

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;
}

如果您想对其进行测试,这是使用此代码的 dot net fiddle的链接

于 2016-07-13T21:56:53.810 回答