在维度上求和多维数组[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在维度上求和多维数组[关闭]相关的知识,希望对你有一定的参考价值。
假设我有这样的锯齿状阵列(3维)。
int[][][] tab = new int[][][]
{
new int[][]
{
new int[] {1, 2, 3},
new int[] {4, 5, 6}
},
new int[][]
{
new int[] {7, 8, 9},
new int[] {10, 11, 12}
}
};
我想在第一维上总结一下。我想得到:
new int[][]
{
new int[] {1+7, 2+8, 3+9},
new int[] {4+10, 5+11, 6+12}
};
我想在第二个方面加以总结。
new int[][]
{
new int{1+4, 2+5, 3+6},
new int{7+10, 8+11, 9+12}
}
怎么做那两件事?我不想要循环,而是LINQ表达式。
答案
这很像APL Reduction操作符,它有一个很酷的功能,可以让你减少任何维度(例如+/tab
与+/[1]tab
)。
在第一个维度上,LINQ具有等价的Aggregate
函数。使用其他一些扩展功能,您可以使用它来执行您想要的操作:
public static class Ext {
public static int[] Add(this int[] v1, int[] v2) => v1.Zip(v2, (v1v, v2v) => v1v+v2v).ToArray();
public static int[][] Add(this int[][] a1, int[][] a2) => a1.Zip(a2, (a1r, a2r) => a1r.Add(a2r)).ToArray();
public static TSource Reduce<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func) => source.Aggregate(func);
public static IEnumerable<T> Reduce2<T>(this IEnumerable<IEnumerable<T>> src, Func<T, T, T> op) => src.Select(s => s.Reduce(op));
}
我将Aggregate
重命名为Reduce
以保持APL主题。
使用Reduce
函数,您可以减少第一维,添加2D数组:
var ans1 = tab.Reduce((a1, a2) => a1.Add(a2));
使用Reduce2
函数,您可以减少第二维,添加1D数组:
var ans2 = tab.Reduce2((a1, a2) => a1.Add(a2)).ToArray();
由于我写了qazxsw poi / qazxsw poi在qazxsw poi上是通用的,你必须将Reduce
答案转换回数组。
另一答案
由于使用了锯齿状数组,每个相应组中最小数组的长度用于索引以避免Reduce2
:
IEnumerable
以上是关于在维度上求和多维数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章