如何按二维数组逻辑创建二维List?Unity代码报错解决
二维数组转嵌套List实现与索引越界问题解决
需求可行性
完全可行。List<List<Vector3>>的嵌套结构天然支持按行组织数据,且通过[行索引][列索引]的访问方式和二维数组逻辑完全一致,完全满足你的需求。
正确实现代码
以下是Unity环境下的C#实现代码,严格遵循行组织逻辑:
// 示例:初始化100×10的二维数组(实际可替换为你的已有数组) Vector3[,] originalArray = new Vector3[100, 10]; // 可选:给数组填充测试数据 for (int i = 0; i < originalArray.GetLength(0); i++) { for (int j = 0; j < originalArray.GetLength(1); j++) { originalArray[i, j] = new Vector3(i, j, 0); } } // 转换为嵌套List List<List<Vector3>> arrayToList = new List<List<Vector3>>(); int rowCount = originalArray.GetLength(0); // 行数:100 int colCount = originalArray.GetLength(1); // 列数:10 for (int row = 0; row < rowCount; row++) { List<Vector3> currentRow = new List<Vector3>(); for (int col = 0; col < colCount; col++) { currentRow.Add(originalArray[row, col]); } arrayToList.Add(currentRow); }
访问验证
按需求通过arrayToList[行索引][列索引]即可获取对应元素,例如:
// 获取原数组[10,8]对应的元素 Vector3 target = arrayToList[10][8]; Debug.Log(target); // 输出(10.00, 8.00, 0.00)(对应测试数据)
打印实现
按每行10个元素的格式打印:
foreach (var row in arrayToList) { // 将每行元素格式化为字符串,保留两位小数 string rowContent = string.Join(" ", row.Select(v => $"({v.x:F2}, {v.y:F2}, {v.z:F2})")); Debug.Log(rowContent); }
索引越界错误排查与解决
ArgumentOutOfRangeException通常由以下几种常见原因导致,对应解决方法如下:
1. 数组维度长度获取错误
- 问题:混淆了二维数组的行、列维度,比如用
GetLength(1)取行数,GetLength(0)取列数,导致循环次数超出实际范围。 - 解决:严格区分
GetLength(0)(第一维,行数)和GetLength(1)(第二维,列数),打印rowCount和colCount的值确认是100和10。
2. 访问索引超出合法范围
- 问题:访问嵌套List时,行索引≥100(最大合法行索引是99)或列索引≥10(最大合法列索引是9)。
- 解决:访问前添加索引合法性判断,例如:
int targetRow = 10; int targetCol = 8; if (targetRow >= 0 && targetRow < arrayToList.Count && targetCol >= 0 && targetCol < arrayToList[targetRow].Count) { Vector3 safeTarget = arrayToList[targetRow][targetCol]; }
3. 子List元素未完全填充
- 问题:循环添加元素时提前终止,导致某个子List的元素数量不足10个,访问列索引时越界。
- 解决:检查内层循环条件,确保
col < colCount,且没有提前break的逻辑。
内容的提问来源于stack exchange,提问作者zarza nefye
相关产品推荐
相关产品推荐

