找到所有组合,伪

时间:2013-05-08 19:05:01

标签: c# pseudocode

我有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语句,但它根本不能正常工作。

2 个答案:

答案 0 :(得分:4)

Eric Lippert写了一篇关于如何编写一个方法的精彩文章,该方法可以采用任意数量的序列,每个序列都有一个任意大小,并找到笛卡尔积(这就是你的技术术语'要求)C#中的所有序列。

This is a link to that article

他在文章末尾得出的代码如下,尽管我强烈建议阅读这篇文章,看看他是如何在那里结束的:

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

答案 1 :(得分: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行。