0

文字列値の 2 つ以上の配列を持つことができる問題に取り組んでいます。

最初の配列から始めて、各値を取得し、次の配列の最初の値と 3 番目の配列の最初の値を連結する必要があります。すべての可能な組み合わせが結合されるまで続けます。

例:

Array1 {'A', 'B'}
Array2 {'C', 'D', 'E'}
Array3 {'F', 'G', 'H'}

出力は次のようになります

Row 1 = A, C, F
Row 2 = A, C, G
Row 3 = A, C, H
Row 4 = A, D, F
Row 5 = A, D, G
Row 6 = A, D, H

など、すべての組み合わせが完了するまで。この場合、18 の組み合わせになります。

以前に文字列連結を使用して値を結合したことがありますが、配列の数と内部の項目の数が変化してこのタイプの出力を生成するようなプロセスでは決して使用しませんでした。

4

3 に答える 3

2

これが答えです

List<string[]> lists = new List<string[]>()
{
    new[]{"A", "B"},
    new[]{"C", "D", "E"},
    new[]{"F", "G", "H"}
};

var cp = lists.CartesianProduct();

foreach(var line in cp)
{
    Console.WriteLine(String.Join(" ",line));
}

public static partial class MyExtensions
{
    //http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx
    public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
    {
        // base case: 
        IEnumerable<IEnumerable<T>> result = new[] { Enumerable.Empty<T>() };
        foreach (var sequence in sequences)
        {
            var s = sequence; // don't close over the loop variable 
            // recursive case: use SelectMany to build the new product out of the old one 
            result =
                from seq in result
                from item in s
                select seq.Concat(new[] { item });
        }
        return result;
    }
}
于 2013-04-15T19:10:41.560 に答える
0

デカルト積アルゴリズムを使用して、すべての組み合わせを一覧表示できます。

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

namespace CartesianProduct
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] array1 = new char[] { 'A', 'B' };
            char[] array2 = new char[] { 'C', 'D', 'E' };
            char[] array3 = new char[] { 'F', 'G', 'H' };

            int iterations = array1.Length * array2.Length * array3.Length;

            for (int i = 0; i < iterations; i++)
            {
                Console.WriteLine("{0}, {1}, {2}", array1[i % array1.Length], array2[i % array2.Length], array3[i % array3.Length]);
            }
            Console.WriteLine("Total iterations: " + iterations.ToString());
            Console.Read();
        }
    }
}
于 2013-04-15T19:10:10.860 に答える
0

ネストされた for ループはこれで機能します。

for (int i=0;i<=Array1.Length;i++)
{
  for (int j=0; j<=Array2.Length; j++)
  {
    for (int k=0;k<=Array3.Length; k++)
      //output however Array1[i] + ", " + Array2[j] + ", " + Array3[k];
  }
}
于 2013-04-15T19:04:12.100 に答える