int到一个数组

时间:2018-04-11 12:53:36

标签: c# arrays

假设我有以下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。数组的长度是我拥有的数组的数量,但假设我不知道我有多少数组及其长度。

2 个答案:

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