【问题标题】:Traversing a 3D array in different order以不同的顺序遍历 3D 数组
【发布时间】:2012-08-11 13:15:18
【问题描述】:

我有一个这样的数组: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

看起来很琐碎,但我无法理解..

【问题讨论】:

  • C# 命名约定:gridFloorRowCol。但无论如何,您可能应该想一个更好的名称(就数组代表的内容而言, 例如rooms?)

标签: c# traversal jagged-arrays


【解决方案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] 的转换有意义,您需要每个维度内的大小相同,因此您应该能够使用多维数组。

【讨论】:

  • 我在想 C++ 数组。无论如何,我不想去多维数组。困扰我的是我已经有了我想要的数据,但我只想在一个不同的方式,这怎么可能?我不能通过以不同的方式将其复制到新的数组来将其转换为另一个锯齿状数组吗?
  • @Icebone1000 对于锯齿状数组,您无法确定每个数组在每个维度上的大小都相同。因此,您不会知道grid_row_col_floor[row][col] 数组需要多大才能包含所有楼层。您必须首先遍历整个数组,收集所有数组大小,使用所有这些大小创建新数组并填充它。这是两个昂贵​​的深度循环,仅用于转换。
  • @Icebone1000 当然,如果你知道数组在所有维度上都应该有相同的大小,你可以作弊并使用grid_floor_row_col[0].Length作为行和@987654331 @ 代表楼层,假设grid_floor_row_col[0][0] 将始终存在。不过,它不是很优雅,对于您的用例,多维数组会更适合。
猜你喜欢
  • 2014-07-29
  • 2021-04-09
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多