2012-08-11 123 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