2013-02-01 51 views
0

我有n陣列數量和每個陣列可能包含n元素數量。我必須通過從每個數組中獲取一個元素來生成所有可能的值組合。從多個陣列(C#/ VB.NET)生成所有可能的組合(C#/ VB.NET)

我需要C#/ VB.NET語言的幫助。

下面是一個例子。

ARR1:(A,B,C) ARR2:(1,2) ARR3:(X,Y,Z)

我想要的組合如(將會有3 * 2 * 3 = 18個組合) A1X A1Y a1z A2X A2Y A2Z B1X B1Y b1z B2X B2Y b2z C1X C1Y C1Z C2X C2Y C2Z

如果我有4個陣列,將有36種組合。 ARR1:(A,B,C) ARR2:(1,2) ARR3:(X,Y,Z) Arr4:(M,N)

組合:

a1xm a1xn a1ym a1yn a1zm a1zn ... ... ... ... ... ... ... ... ... ... ... ...

基於
+0

你有什麼_tried_? – RobH

回答

6

在文章Eric Lippert

void Main() 
{ 
    var set1 = new object[]{'a', 'b', 'c'}; 
    var set2 = new object[]{1,2,}; 
    var set3 = new object[]{'x', 'y', 'z'}; 

    string.Join(", ", new[] {set1, set2, set3}.CartesianProduct().Select(item => item.ToArray()).Select(item => string.Format("({0},{1},{2})", item[0], item[1], item[2]))).Dump(); 
} 


public static class CartesianProductContainer 
{ 
    public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) 
    { 
     IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 
     return sequences.Aggregate( 
      emptyProduct, 
      (accumulator, sequence) => 
       from accseq in accumulator 
       from item in sequence 
       select accseq.Concat(new[] {item})); 
    } 
} 

輸出:

(a,1,x), (a,1,y), (a,1,z), (a,2,x), (a,2,y), (a,2,z), (b,1,x), (b,1,y), (b,1,z), (b,2,x), (b,2,y), (b,2,z), (c,1,x), (c,1,y), (c,1,z), (c,2,x), (c,2,y), (c,2,z)