将二维阵列更改为锯齿状阵列

本文关键字:阵列 锯齿状 二维 | 更新日期: 2023-09-27 18:27:10

在我的代码中,我使用了一个2D多维数组来表示网格(并不总是大小相等,例如10x15或21x7)。在阅读了锯齿状阵列是如何更快并且通常被认为更好的之后,我决定将我的2D阵列更改为锯齿状阵列。

这就是我声明多维数组的方式:

int[,] array = new int[10, 10];

我试图弄清楚如何声明并初始化相同的东西,但使用锯齿状数组。

编辑这段代码在一个类中,在构造函数中我已经有了:

class ProceduralGrid
{
    private int[][] grid;
    private int _columns;
    private int _rows;
    public ProceduralGrid(int rows, int columns)
    {
        _rows = rows;             //For getters
        _columns = columns;
        //Create 2D grid
        int x, y;
        grid = new int[rows][];
        for (x = 0; x < grid.Length; x++)
        {
            grid[x] = new int[10];
        }
    }
    public int GetXY(int rows, int columns)
    {
        if (rows >= grid.GetUpperBound(0) + 1)
        {
            throw new ArgumentException("Passed X value (" + rows.ToString() +
                ") was greater than grid rows (" + grid.GetUpperBound(0).ToString() + ").");
        }
        else
        {
            if (columns >= grid.GetUpperBound(1) + 1)
            {
                throw new ArgumentException("Passed Y value (" + columns.ToString() +
                    ") was greater than grid columns (" + grid.GetUpperBound(1).ToString() + ").");
            }
            else
            {
                return grid[rows][columns];
            }
        }
    }
}

在另一种方法中,我只是在做:

    Console.WriteLine(grid.GetXY(5, 5).ToString());

我收到的错误消息:

Unhandled Exception: System.IndexOutOfRangeException: Array does not have that m
any dimensions.
   at System.Array.GetUpperBound(Int32 dimension)
   at ProcGen.ProceduralGrid.GetXY(Int32 rows, Int32 columns) in C:'Users'Lloyd'
documents'visual studio 2010'Projects'ProcGen'ProcGen'ProceduralGrid.cs:line 115
   at ProcGen.Program.Main(String[] args) in C:'Users'Lloyd'documents'visual stu
dio 2010'Projects'ProcGen'ProcGen'Program.cs:line 27

我做错了什么?我应该怎么做?

将二维阵列更改为锯齿状阵列

由于您处理的是一维数组,您可以简单地使用Length属性来获取第一个维度的长度:

int[][] grid = new int[10][];
for (int x = 0; x < grid.Length; x++)
{
    grid[x] = new int[10];
}

(使用GetLength方法也可以:)

int[][] grid = new int[10][];
for (int x = 0; x < grid.GetLength(0); x++)
{
    grid[x] = new int[10];
}

代码的问题在于,您调用的是grid.GetUpperBound(1),其中grid是一个一维数组——它没有第二个维度(索引1),您可以得到它的上界。

你的GetXY方法应该是这样的:

public int GetXY(int x, int y)
{
    if (x < 0 || x >= grid.Length)
    {
        throw ...
    }
    int[] items = grid[x];
    if (y < 0 || y >= items.Length)
    {
        throw ...
    }
    return items[y];
}

请注意,锯齿状数组并不是让代码更快的魔法–测量他们是否真的这样做了!