在维度上求和多维数组[关闭]

问题描述 投票:-6回答:2

假设我有这样的锯齿状阵列(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表达式。

c# arrays linq sum jagged-arrays
2个回答
1
投票

这很像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答案转换回数组。


0
投票

由于使用了锯齿状数组,每个相应组中最小数组的长度用于索引以避免Reduce2

IEnumerable
© www.soinside.com 2019 - 2024. All rights reserved.