C#如何裁剪二维数组的非0有效区域并生成新的二维数组?
错误原因
你的代码存在3个核心问题:
- 新数组维度计算错误:有效区域的行数应为
最大行索引 - 最小行索引 + 1,列数应为最大列索引 - 最小列索引 + 1,原代码直接用最大索引作为维度完全不符合需求 - 赋值循环的边界逻辑完全错误,不需要做减yM/xM的判断,直接遍历新数组的所有下标,对应原数组的偏移量计算即可
- 缺少边界处理:如果原数组全为0、无有效元素时,调用List的Min/Max方法会抛出异常,同时你代码中的参数n无实际作用可以直接移除
修正后的代码
public static int[,] Trim2DArray(int[,] fArray) { List<int> rangeX = new List<int>(); List<int> rangeY = new List<int>(); // 遍历收集所有非0元素的坐标 for (int y = 0; y < fArray.GetLength(0); y++) { for (int x = 0; x < fArray.GetLength(1); x++) { if (fArray[y, x] > 0) { rangeX.Add(x); rangeY.Add(y); } } } // 边界处理:全0数组直接返回空二维数组 if (rangeX.Count == 0) { return new int[0, 0]; } // 计算有效区域的边界 int minX = rangeX.Min(); int maxX = rangeX.Max(); int minY = rangeY.Min(); int maxY = rangeY.Max(); // 计算新数组的维度 int newRows = maxY - minY + 1; int newCols = maxX - minX + 1; int[,] result = new int[newRows, newCols]; // 按偏移量赋值 for (int i = 0; i < newRows; i++) { for (int j = 0; j < newCols; j++) { result[i, j] = fArray[minY + i, minX + j]; } } return result; }
调用效果
用你给出的测试数组调用该方法,得到的结果完全符合预期:
1 0 0 3 0 2 0 4 6 0 6 0
内容的提问来源于stack exchange,提问作者Kuzan
相关产品推荐
相关产品推荐

