我有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);
}
答案 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 ();