展平N个阵列

时间:2017-01-27 02:01:14

标签: c# arrays

我有2个相同类型和大小(L)的数组,如果第二个数组的值为0,我想将它们展平为其中一个数组或新数组。例如:

Arr1 = { 0, 1, 2, 5, 0, 7, 6, 8 }
Arr2 = { 0, 0, 3, 1, 9, 2, 0, 1 }
Flat = { 0, 1, 3, 1, 9, 2, 6, 1 }

我意识到我可以通过比较迭代地(见下文)这样做,但我觉得应该有更好的方式表达和执行此操作(希望以最高效率)。

for (var i = 0; i < Arr1.Length; i++)
{
    Arr1[i] = Arr2[i] != 0 ? Arr2[i] : Arr1[i];
}

此外,是否可以将其扩展为在有序列表中展平N个数组?

多阵列示例:

Arr1 = { 0, 1, 2, 5, 0, 7, 6, 8 }
Arr2 = { 0, 0, 3, 0, 9, 2, 0, 1 }
Arr3 = { 0, 2, 1, 0, 1, 0, 0, 0 }

Flat = { 0, 2, 1, 5, 1, 2, 6, 1 }

...我想在代码中看起来像这样:

// Assume collection is ordered via some predicate
// var myArrays = existingArrays.OrderByDescending(myPredicate).ToList();

// Some function to flatten position 'index'
int FlattenOrderedValues(IEnumerable<int[]> arrays, int index)
{
    for (int i = 0; i < arrays.Lenth)
    {
        if (arrays[i][index] > 0) return (arrays[i][index];
    }

    return 0;
}

for (var i = 0; i < arrays[0].Length; i++)
{
    arrays[0][i] = FlattenOrderedValues(arrays, i);
}

3 个答案:

答案 0 :(得分:8)

使用LINQ,您可以Zip两个数组并根据两个数组中两个相应项的值选择结果:

var Flat = Arr1.Zip(Arr2, (a1, a2) => a2 == 0 ? a1 : a2).ToArray()

如果您有N个阵列,您可以多次应用相同的方法。但那不会很有效率。如此简单的for循环与索引访问将完成这项工作。或者您可以再次使用LINQ按索引访问所有数组:

var Flat =  Enumerable.Range(0, Arr1.Length)
                      .Select(i => Arr2[i] == 0 ? Arr1[i] : Arr2[i]) // use N arrays here
                      .ToArray()

更新(适用于您的样本)。您只需选择&#39;列&#39;对于每个索引并选择最后一个大于零的值

var Flat = Enumerable.Range(0, arrays[0].Length)
                     .Select(i => arrays.Select(a => a[i]).LastOrDefault(x => x > 0))
                     .ToArray();

答案 1 :(得分:2)

阅读Sergey的回答,我提出了这个问题:

int[] Arr1 = { 0, 1, 2, 5, 0, 7, 6, 8 };
int[] Arr2 = { 0, 0, 3, 0, 9, 2, 0, 1 };
int[] Arr3 = { 0, 2, 1, 0, 1, 0, 0, 0 };

int[][] arrays = { Arr1, Arr2, Arr3 };

int[] result = arrays.Aggregate((a, b) => a.Zip(b, (i, j) => j == 0 ? i : j).ToArray());

答案 2 :(得分:0)

阅读这些答案我想从自己那里得到一些东西。尽管这些答案工作正常......但是他们所做的事情太长了。

我的解决方案是将所有这些打包到一个数组中,然后简单地使用SelectMany方法将这些数组自动拼接成一个。

int [] combinedarrays = { array1, array2, array3 };
int [] result = combinedarrays. SelectMany (i => i).Distinct ().ToArray ();