0

n個の配列があり、各配列には n 個の要素が含まれる場合があります。各配列から 1 つの要素を取得して、考えられるすべての値の組み合わせを生成する必要があります。

C#/VB.NET 言語のヘルプが必要です。

以下は例です。

1 着: ( a, b, c ) 2 着: ( 1, 2 ) 3 着: ( 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 の組み合わせがあります。1 着: ( a, b, c ) 2 着: ( 1, 2 ) 3 着: ( x, y, z ) 4 着: ( m, n )

組み合わせ:

a1xm a1xn a1ym a1yn a1zm a1zn … … … … … … … … … </p>

4

2 に答える 2

7

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)
于 2013-02-01T09:25:31.943 に答える
3

最初の方法

ネストされた For ループを使用できます

for (int i=0; i < Arr1.Length ; i++)
{  
  for (int j=0; i < Arr2.Length ; j++)
  {  
     like this..............
  }  
}  

2番目の方法

C# - 複数の配列/リストを反復処理する最も効率的な方法

于 2013-02-01T10:22:28.460 に答える