c# - 将二维数组更改为锯齿状数组

标签 c# jagged-arrays

在我的代码中,我使用二维多维数组来表示网格(并不总是大小相等,例如 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 Property获取第一维的长度:

int[][] grid = new int[10][];

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

(使用 GetLength Method 也可以:)

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];
}

请注意,锯齿状数组并不是让您的代码更快的魔法 - 衡量它们是否确实如此!

关于c# - 将二维数组更改为锯齿状数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176898/

相关文章:

c# - 是否可以使用库中的类型创建 DataContract?

arrays - 如何从 MATLAB 中的矩阵中删除零?

c# - 如何明确表示不抛出异常?

c# - 向 Unity 注册 IAuthenticationManager

c# - 如何删除 wpf 中动态添加的控件

c# - 使用交错数组进行线性搜索?

java - 静态方法和锯齿状数组

c# - 如何在 C# 中修复此合并排序的实现

python - 如何快速对扁平化的 "jagged"numpy 数组重新排序

c - C 中的锯齿状数组