-1

10 行あり、各行には 1 ~ 100 の値を持つ 1 ~ 10 の数値を含めることができます (実際の値は重要ではありません)。例として、最初の 3 行は次のようになります。

1. (2 numbers)                         1st 2nd 1st 2nd
2. (1 number)   all combinations --->  1st 1st 1st 1st
3. (2 numbers)                         1st 1st 2nd 2nd

実数の場合:

1. 5, 7                                5   7  5  7
2. 2            all combinations --->  2   2  2  2
3. 12, 24                              12 12 24 24

This results in a total of 4 unique combinations.

これはどのように解決できますか?for ループと if ステートメントを試してみましたが、期待どおりに動作しません。

4

2 に答える 2

4

Eric Lippert は、それぞれが任意のサイズの任意の数のシーケンスを取り、これらすべてのシーケンスのデカルト積 (求めているものの専門用語です) を見つけることができるメソッドを作成する方法について、素晴らしい記事を書きました。 C# .

その記事へのリンクです

記事の最後で彼が導き出したコードは次のとおりですが、記事を読んで、彼がどのようにしてそこにたどり着いたかを確認することを強くお勧めします。

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})); 
}

簡単な使用例:

var array = new string[][] { new[] { "a", "b" }, new[] { "1", "2" } };
foreach (var product in array.CartesianProduct())
    Console.WriteLine(string.Join(" ", product));
于 2013-05-08T19:08:18.310 に答える
1

C# で Linq を使用する簡単な方法:

int[][] integers = ...
var results = 
    from row1 in integers[0]
    from row2 in integers[1]
    from row3 in integers[2]
    ...
    select new { row1, row2, row3, ... };

常に10行あるとおっしゃっていたので、これが最も簡単な方法だと思います。

于 2013-05-08T19:16:44.087 に答える