2012-05-01 46 views
0

讓我們說我們有休耕類「X」的所有可能的類的組合,「Y」,「Z」, 結果,所以我需要將這樣的如何獲得在C#

(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) 

什麼算法,我需要做到這一點?

+0

你說的是類嗎?在C#類中?我猜不是,但你的問題並不清楚。聽起來有點家庭作業。 – Cylindric

+1

有幾個算法,包括這裏的實現:http://stackoverflow.com/questions/999050/most-elegant-way-to-get-all-subsets-of-an-array-in-c-sharp – kuba

+0

爲什麼'(J)'和'(X,Y,Z)'不在你的第二個列表中? –

回答

7

你在找什麼叫做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(特別是標題爲「將子集表示爲功能」的部分)。