如何使用LINQ对三维锯齿数组按第一、第二维度求和(无需循环)
用LINQ实现三维锯齿数组的维度求和
嘿,这个需求我太熟悉了!用LINQ处理锯齿数组的维度求和,核心就是把每个维度的层级关系理清楚,不用循环就能轻松搞定。我给你分两种场景一步步讲,还附了示例代码方便对照:
先明确数组结构
首先咱们先定义一个示例三维锯齿数组,帮你直观理解层级:
// 示例:第一维度有2个块,每个块包含3个第二维度数组,每个数组是第三维度的具体数值 int[][][] jagged3D = new int[][] { new int[][] { new int[] { 1, 2 }, new int[] { 3, 4 }, new int[] { 5, 6 } }, new int[][] { new int[] { 7, 8 }, new int[] { 9, 10 }, new int[] { 11, 12 } } };
1. 按第一维度求和
按第一维度求和,意思是把每个第一维度块里的所有数值加总,最终得到一个和数组,每个元素对应原数组第一维度的一个块。
用LINQ的写法非常直接:
// 遍历第一维度的每个块,摊平所有嵌套的数值后求和 var sumByFirstDimension = jagged3D .Select(block => block.SelectMany(row => row).Sum()) .ToArray(); // 结果:[21, 57](1+2+3+4+5+6=21;7+8+9+10+11+12=57)
这里的SelectMany(row => row)是把第二维度的每个数组“摊平”成单个数值元素,再用Sum()把整个块的数值加起来,最后转成数组就得到了第一维度的求和结果。
2. 按第二维度求和
按第二维度求和,是把所有第一维度块中,相同位置的第二维度数组的数值加总。这里要注意锯齿数组的特性:不同第一维度块的第二维度长度可能不一样,所以咱们要做个兼容处理,避免索引越界。
代码实现如下:
// 先获取第二维度的最大长度,处理长度不一致的情况 int maxSecondDimLength = jagged3D.Max(block => block.Length); // 遍历第二维度的每个索引,对所有块中对应位置的数组求和 var sumBySecondDimension = Enumerable.Range(0, maxSecondDimLength) .Select(index => jagged3D .Where(block => index < block.Length) // 跳过那些第二维度长度不够的块 .SelectMany(block => block[index]) .Sum()) .ToArray(); // 示例的结果:[18, 26, 34]((1+2)+(7+8)=18;(3+4)+(9+10)=26;(5+6)+(11+12)=34)
如果你的三维锯齿数组是严格对齐的(每个第一维度块的第二维度长度完全相同),可以去掉Where那一行,直接访问block[index]就行,代码会更简洁。
内容的提问来源于stack exchange,提问作者Piotr Bródka
相关产品推荐
相关产品推荐

