2012-08-11 101 views
1

一个3D阵列我有一个数组这样的:int[][][] grid_floor_row_col;遍历以不同的顺序

欲穿越这样的:int[][][] grid_row_col_floor;

首先,我试图改变for循环,然后改变阵列(复印到一个新的),但我不能做到这一点,我的脑海里没有更进一步......我甚至不知道如果有可能..

这是相同的数据,我只需要以不同的顺序遍历,读取每列,每行的所有楼层....下面是我如何遍历:

for (int floor = 0; floor < grid_floor_row_col.Length; floor++) 
{ 
    for (int row = 0; row < grid_floor_row_col[floor].Length; row++) 
    { 
     for (int col = grid_floor_row_col[floor][row].Length - 1; col >= 0; col--) 
     { 
      //do stuff 
     } 

    } 
} 

现在我需要遍历:

for rows 
    for cols 
    for floors 

似乎很琐碎,但我不能让它..

+0

C#命名约定:'gridFloorRowCol'。但无论如何,你应该想到一个更好的名字(根据数组*代表什么,例如'房间'?) – Adam 2012-08-11 13:37:39

回答

1

你有什么没有一个multidimensional array,但jagged array 。在多维数组中,您有一个数组表示一个固定的n维元素矩阵。在一个锯齿状的数组中,你有一个数组可能具有不同大小的数组。

假设您可以定义转换为int[,,] grid_floor_row_col,您可以通过使用Array.GetLength(int)以任意顺序维度进行迭代。

for (int row = 0; row < grid_floor_row_col.GetLength(1); row++) { 
    for (int col = 0; col < grid_floor_row_col.GetLength(2); col++) { 
     for (int floor = 0; floor < grid_floor_row_col.GetLength(0); floor++) { 
      int elem = grid_floor_row_col[floor, row, col]; 
      // do stuff 
     } 
    } 
} 

你不能用的原因很简单,每个楼层阵列可以有不同的尺寸,这意味着不同数量的每个楼层的行(同样适用于列每行)交错数组做到这一点。如果从[floor, row, col][row, col, floor]的转换是有意义的,那么需要每个维度内的大小相同,因此您应该可以使用多维数组。

+0

我在想C++数组..不管怎么说,我不想去多维数组..什么烦恼我是我已经有了我想要的数据,但我只想以不同的方式访问它,那怎么可能呢?不能把它转换成另一个参差不齐的数组,以不同的方式将它复制到新的数组中? – Icebone1000 2012-08-11 13:42:15

+1

@ Icebone1000使用锯齿状数组时,无法确定每个数组在每个维度上的大小是否相同。因此,您不会知道'grid_row_col_floor [row] [col]'数组需要多大以容纳所有楼层。您必须首先遍历整个数组,收集所有数组大小,使用所有这些大小创建新数组并填充它。这是两个昂贵​​的深层循环,仅用于转换。 – 2012-08-11 21:09:04

+0

@ Icebone1000当然,如果您知道数组在所有维度上应该具有相同的大小,您可以欺骗一下并使用'grid_floor_row_col [0] .Length'作为行和'grid_floor_row_col [0] [0]。长度“,假设'grid_floor_row_col [0] [0]'将始终存在。尽管如此,它并不是非常优雅,对于您的用例来说,多维数组会更适合。 – 2012-08-11 21:11:24