如何在C#中获取所有可能的类组合

时间:2012-05-01 09:45:39

标签: c# algorithm

假设我们有'X','Y','Z', 我需要的结果将是这样的

(X),(X,Y),(X,Z),(X,Y,Z),(Y),(Y,Z),(Z)

如果我们有'X','Y','Z','J', 我需要的结果将是这样的

(X), (X,Y),(X,Z),(X,J), (Y), (Y,Z),(Y,J), (Z),(Z,J)
(X,Y,Z), (X,Y,Z,J), (Y,Z,J), (Z,J,X)

我需要什么算法才能完成此任务?

2 个答案:

答案 0 :(得分:7)

您要找的是power set。有递归和迭代的方法来计算它; google应该不难。

尝试实施算法,如果遇到特定问题,请回来更新问题。

答案 1 :(得分:2)

如果这是一个电源设置,你错过了空集(当然,它总是电源组的成员!)。

无论如何,这样的事情对你有用:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            string[] classes = {"X", "Y", "Z"};

            foreach (var combination in PowerSet(classes))
            {
                foreach (var item in combination)
                {
                    Console.Write(item + ", ");
                }

                Console.WriteLine("");
            }
        }

        public static IEnumerable<IEnumerable<T>> PowerSet<T>(T[] sequence)
        {
            return from m in Enumerable.Range(0, 1 << sequence.Length)
                   select
                       from i in Enumerable.Range(0, sequence.Length)
                       where (m & (1 << i)) != 0
                       select sequence[i];
        }
    }
}

该算法通过“假装”组合是二进制数来工作。有关详细信息,请参阅http://en.wikipedia.org/wiki/Power_set(特别是标题为“将子集表示为函数”的部分)。