假设我有以下int数组:
var array1 = new[] {0, 2, 4, 6};
var array2 = new[] {0, 4, 5, 7};
var array3 = new[] {1, 4, 3, 5};
如何将其合并到一个数组中,以便结果是数组中所有可能值组合的列表?即类似于:
var resultingArray = new[] {new[] {0, 0, 1}, new[] {0, 4, 1}, new[] {0, 5, 1}....};
E.g。数组的长度是我拥有的数组的数量,但假设我不知道我有多少数组及其长度。
答案 0 :(得分:2)
你不能自动和动态地合并它们,因为你的程序不知道manny和你得到的数组。 但是你可以轻松地创建一个数组数组,因为你可以对其进行硬编码,如下所示:
int resultingArray[][] = new int[3][]; // 3 = X maybe
resultingArray [0] = array1;
resultingArray [1] = array2;
resultingArray [2] = array3;
// ... up to X
如果可视化结构,它将如下所示:
[[0,2,4,6], [...], [...]]
答案 1 :(得分:2)
这被称为N-ary Cartesian产品。
Eric Lippert blogged a solution to this:
public static IEnumerable<IEnumerable<T>> Combine<T>(params IEnumerable<T>[] sequences)
{
return Combine(sequences.AsEnumerable());
}
public static IEnumerable<IEnumerable<T>> Combine<T>(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 array1 = new[] { 0, 2, 4, 6 };
var array2 = new[] { 0, 4, 5, 7 };
var array3 = new[] { 1, 4, 3, 5 };
var result = var result = Combine(array1, array2, array3);
var combinations = result.Select(x => x.ToArray()).ToArray();
foreach (var combination in combinations)
Console.WriteLine(string.Join(", ", combination));
请注意,您实际上并不需要像上面那样将生成的枚举转换为数组,除非您需要将它们传递给期望数组的方法。
您可以直接使用result
:
foreach (var combination in result)
Console.WriteLine(string.Join(", ", combination));