You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 21:24:04