如何在C#中拼接两个多维object[,]数组?
拼接两个
object[,]二维数组的正确方法 嘿,作为C#新手碰到多维数组的拼接问题太正常了,你之前用List<object[,]>再转数组的思路走不通,是因为这个List存的是多个独立的二维数组,转成数组后得到的是object[][,](二维数组的数组),而不是你想要的单个拼接后的二维数组,完全不是一个东西~
我结合你的Excel场景给你整理一套可行的方案:
核心思路
要拼接两个object[,](假设是按行拼接,也就是把第二个数组的内容接在第一个数组的下面,这也是Excel工作表合并最常见的需求),步骤是:
- 确认两个数组的列数一致(不然没法上下拼接)
- 创建一个新的二维数组,行数是两个数组行数之和,列数和原数组一致
- 分别把两个数组的元素复制到新数组里
完整实现代码
首先先把你获取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
相关产品推荐
相关产品推荐

