2013-08-11 1 views
2

В моем коде я использую двумерный многомерный массив для представления сетки (не всегда равных размеров, например 10x15 или 21x7). После прочтения о том, как массивы с зазубринами работают быстрее и, как правило, рассматриваются лучше, я решил изменить свой 2D-массив на неровный массив.Изменение 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 

Что я делаю неправильно Как я должен это делать?

+3

Не уверен, что делать с 'GetLength (0)', но вы можете просто использовать 'grid.Length'. – Codecat

ответ

4

Так как вы имеете дело с одномерными массивами, вы можете просто использовать 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]; 
} 

Обратите внимание, что неровные массивы не магия, которая делает ваш код быстрее – меры, если они на самом деле!

+0

Чтобы уточнить, этот код находится в классе, а в конструкторе класса у меня уже есть private int [] [] grid; Я забыл упомянуть об этом. – user9993

+0

Тогда я не знаю, откуда берутся ваши сообщения об ошибках. Можете ли вы добавить код для короткой, но полной программы, которая демонстрирует проблему? Какое сообщение об ошибке вы получаете точно? – dtb

+0

Хорошо, я добавил класс. – user9993