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

如何在C#中拼接两个多维object[,]数组?

拼接两个object[,]二维数组的正确方法

嘿,作为C#新手碰到多维数组的拼接问题太正常了,你之前用List<object[,]>再转数组的思路走不通,是因为这个List存的是多个独立的二维数组,转成数组后得到的是object[][,](二维数组的数组),而不是你想要的单个拼接后的二维数组,完全不是一个东西~

我结合你的Excel场景给你整理一套可行的方案:

核心思路

要拼接两个object[,](假设是按行拼接,也就是把第二个数组的内容接在第一个数组的下面,这也是Excel工作表合并最常见的需求),步骤是:

  1. 确认两个数组的列数一致(不然没法上下拼接)
  2. 创建一个新的二维数组,行数是两个数组行数之和,列数和原数组一致
  3. 分别把两个数组的元素复制到新数组里

完整实现代码

首先先把你获取Excel工作表数据的代码补全,然后加上拼接方法:

// 先获取两个工作表的数据
Worksheet sheet1 = (Worksheet)workBookIn.Sheets[1];
Worksheet sheet2 = (Worksheet)workBookIn.Sheets[2];

Range excelRange1 = sheet1.UsedRange;
object[,] arr1 = excelRange1.Value as object[,];

Range excelRange2 = sheet2.UsedRange;
object[,] arr2 = excelRange2.Value as object[,];

// 垂直拼接(按行合并)的方法
public static object[,] ConcatenateVertical2DArrays(object[,] arr1, object[,] arr2)
{
    // 先做参数校验:避免null或者列数不一致
    if (arr1 == null || arr2 == null)
        throw new ArgumentNullException("输入的数组不能为null");
    
    if (arr1.GetLength(1) != arr2.GetLength(1))
        throw new ArgumentException("两个数组的列数必须相同才能垂直拼接");

    int rows1 = arr1.GetLength(0);
    int rows2 = arr2.GetLength(0);
    int cols = arr1.GetLength(1);

    // 创建结果数组
    object[,] combinedArr = new object[rows1 + rows2, cols];

    // 复制第一个数组的所有元素
    for (int i = 0; i < rows1; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            combinedArr[i, j] = arr1[i, j];
        }
    }

    // 复制第二个数组的元素,行索引要偏移第一个数组的行数
    for (int i = 0; i < rows2; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            combinedArr[rows1 + i, j] = arr2[i, j];
        }
    }

    return combinedArr;
}

// 调用拼接方法
object[,] finalCombinedArray = ConcatenateVertical2DArrays(arr1, arr2);

额外补充:按列拼接(左右合并)

如果你需要的是把两个工作表左右合并,只需要调整数组的维度计算和复制逻辑就行:

public static object[,] ConcatenateHorizontal2DArrays(object[,] arr1, object[,] arr2)
{
    if (arr1 == null || arr2 == null)
        throw new ArgumentNullException("输入的数组不能为null");
    
    if (arr1.GetLength(0) != arr2.GetLength(0))
        throw new ArgumentException("两个数组的行数必须相同才能水平拼接");

    int rows = arr1.GetLength(0);
    int cols1 = arr1.GetLength(1);
    int cols2 = arr2.GetLength(1);

    object[,] combinedArr = new object[rows, cols1 + cols2];

    // 复制第一个数组的列
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols1; j++)
        {
            combinedArr[i, j] = arr1[i, j];
        }
    }

    // 复制第二个数组的列,列索引偏移cols1
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols2; j++)
        {
            combinedArr[i, cols1 + j] = arr2[i, j];
        }
    }

    return combinedArr;
}

为什么之前的方法失败?

再啰嗦一句:List<object[,]>里的每个元素都是一个独立的二维数组,当你调用list.ToArray()时,得到的是object[][,]类型——这是一个数组的数组,每个元素都是一个二维数组,而不是把所有元素合并成一个大的二维数组,所以完全达不到你想要的拼接效果哦。

内容的提问来源于stack exchange,提问作者usr4896260

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:13:32