-1

我有 10 行,每行可以有 1-10 个数字,值为 1-100(实际值并不重要)。例如,前三行如下所示:

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 回答