2

私のコードでは、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

私は何を間違っていますか、どうすればいいですか?

4

1 に答える 1

4

1 次元配列を扱っているため、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)コードの問題は、 whereが 1 次元配列であることを呼び出していることですgrid。上限を取得できる 2 番目の次元 (インデックス 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];
}

ジャグ配列はコードを高速化する魔法ではないことに注意してください。

于 2013-08-11T21:35:17.683 に答える