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