【问题标题】:How to get all possible classes combinations in C#如何在 C# 中获取所有可能的类组合
【发布时间】:2012-06-20 04:49:12
【问题描述】:

假设我们有闲置类 '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)

我需要什么算法来完成这个?

【问题讨论】:

  • 你说的是类吗?就像在 C# 类中一样?我猜不是,但从你的问题中不清楚。听起来有点功课。
  • 这里有一些算法,包括实现:stackoverflow.com/questions/999050/…
  • 为什么(J)(X, Y, Z) 不在你的第二个名单上?
  • 我想是被遗忘了...顺便说一句:(X,Y,Z) 存在于第二个列表中

标签: c# algorithm


【解决方案1】:

您要查找的内容称为power set。有递归和迭代两种方法来计算它;用谷歌搜索应该不难。

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

【讨论】:

    【解决方案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(尤其是标题为“将子集表示为函数”的部分)。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2019-09-27
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多