如何合并object[][]类型交错数组的最后两列并移除最后一列?
问题解决:合并交错数组时去除多余嵌套结构
问题描述
我有一个10行5列的object[][]类型交错数组,需要将最后两列合并至倒数第二列,并移除最后一列。例如原数组第一行的sampleData[3]为含2个元素的object[],sampleData[4]为含1个元素的object[];合并后sampleData[3]应包含3个元素,同时移除sampleData[4]。但我编写的代码运行后,合并后的sampleData[3]出现多余的{object[1]}嵌套结构,需要去除该层级。
尝试的代码
public static object[][] MergeResults(object[][] sampleData) { object[] mergedArray, actualData; object[][]results; if(sameplData != null && samepleData.Any()) { int row = 0; int totalNoOfColumns = sampleData[0].length; int noOfColumns = totalNoOfColumns; results = new object[sampleData.Count()][]; int objectCount = sampleData[0].Where(x=>x.GetType().Name == "object[]").Count(); foreach(var item in sampleData) { mergedArray = new object[totalNoOfColumns -1]; actualData = new object[objectCount]; int j = 0; for (int i= 0; i < (item.Length - 1); i++) { if(item[i].GetType().Name == "object[]") { int k = 0; while (i < totalNoOfColumns) { actualData[k] = item[i]; i++;k++; } mergedArray[noOfColumns- 2] = actualData; } else { mergedArray[j] = item[i]; j++ } } results[row] = mergedArray; row++; } } return results; }
问题原因
你的代码中,将最后两列的object[]直接作为元素存入了actualData数组,相当于把两个数组本身作为元素存储,导致了额外的嵌套层级。正确的做法应该是扁平合并两个数组内的元素,而不是存储数组对象本身。
修正后的代码
public static object[][] MergeResults(object[][] sampleData) { // 空值判断,直接返回原数组 if (sampleData == null || !sampleData.Any()) return sampleData; int rowCount = sampleData.Length; int originalColumnCount = sampleData[0].Length; int newColumnCount = originalColumnCount - 1; object[][] results = new object[rowCount][]; for (int row = 0; row < rowCount; row++) { object[] currentRow = sampleData[row]; object[] newRow = new object[newColumnCount]; // 复制前originalColumnCount-2列的内容到新行 for (int col = 0; col < originalColumnCount - 2; col++) { newRow[col] = currentRow[col]; } // 安全获取倒数第二列和最后一列的object[] var lastSecondCol = currentRow[originalColumnCount - 2] as object[]; var lastCol = currentRow[originalColumnCount - 1] as object[]; // 合并两个数组的元素,去除嵌套 List<object> mergedElements = new List<object>(); if (lastSecondCol != null) mergedElements.AddRange(lastSecondCol); if (lastCol != null) mergedElements.AddRange(lastCol); // 将合并后的元素数组赋值给新行的倒数第二列 newRow[newColumnCount - 1] = mergedElements.ToArray(); results[row] = newRow; } return results; }
关键改进点
- 扁平合并元素:通过
List<object>的AddRange方法,将两个子数组的元素直接合并到同一个集合中,避免了嵌套 - 安全类型转换:使用
as关键字进行类型转换,同时增加空值判断,防止空引用异常 - 逻辑简化:拆分复制列、合并元素两个步骤,代码可读性更强
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

