C#中如何正确初始化声明为int[][][]类型的三维交错数组?
核心差异说明
C#中两类三维存储结构的语法和底层逻辑完全不同,你遇到的报错是混淆了两者的初始化规则:
int[,,]是矩形多维数组,内存为单块连续空间,所有维度长度必须在初始化时一次性指定,不支持单独提取某一维度的子数组实例,因此无法通过my3DArray[x,y].Length获取子数组长度,访问元素必须传入全部三个索引,格式为my3DArray[x,y,z]。int[][][]是交错数组(也叫锯齿数组),本质是「数组的数组的数组」,每一层都是独立的数组实例,不同层级的数组长度可以独立定义,不要求所有子数组长度统一,因此不支持new int[sizeX][sizeY][sizeZ]这种一次性指定三个维度的初始化写法。
int[][][] 交错数组的正确初始化方案 你不需要额外存储各维度尺寸改用矩形数组,按层级逐次实例化每一层数组即可完成初始化,参考实现如下:
int[][][] my3DArray; void Set3DArraySize(int sizeX, int sizeY, int sizeZ) { // 初始化最外层X维度数组,长度为sizeX,初始所有元素为null my3DArray = new int[sizeX][][]; for (int x = 0; x < sizeX; x++) { // 初始化当前x坐标对应的Y维度数组,长度为sizeY my3DArray[x] = new int[sizeY][]; for (int y = 0; y < sizeY; y++) { // 初始化当前x,y坐标对应的Z维度一维数组,长度为sizeZ my3DArray[x][y] = new int[sizeZ]; } } }
初始化完成后即可实现你需要的子数组长度获取逻辑:
- X维度总长度:
my3DArray.Length - 指定x坐标下Y维度长度:
my3DArray[x].Length - 指定x,y坐标下Z维度长度:
my3DArray[x][y].Length - 元素访问格式为
my3DArray[x][y][z]
补充说明:交错数组的灵活性高于矩形多维数组,你可以根据业务需求给不同x位置设置不同长度的Y维度数组,或是给不同x,y位置设置不同长度的Z维度数组,不需要所有子数组长度保持一致。缺点是内存不是完全连续的,超大规模数据遍历场景下的访问效率略低于矩形多维数组。
内容的提问来源于stack exchange,提问作者Rafael Silva
相关产品推荐
相关产品推荐

