2015-04-30 3 views
0

У меня есть многомерный массив, который выглядит следующим образом:Доступ одно измерение многомерного массива

public static int[,] GameObjects = new int[,] 
{ 
    //Type,X,Y,Width,Height 
    {0,50,50,10,100}, 
    {1,50,150,10,20} 
}; 

Я пытаюсь получить доступ к одному «строку» значений и хранить их в переменную внутри for цикла:

Я хочу, чтобы g сохранял значения первого массива, поэтому в первом цикле g следует хранить 0,50,50,10,100. Код дает ошибку Wrong number of indices inside []; expected 2

+0

'int [,]' и 'int [ ] [] 'не совпадают. Я забыл о специфике (глядя сейчас, я нахожу его, я отправлю ответ) – Flater

+0

'int [,]' не совпадает с 'int [] []'. Вам нужно скопировать значения одной строки в новый массив. –

+0

Посмотрите на это http://stackoverflow.com/questions/5132397/fast-way-to-convert-a-two-dimensional-array-to-a-list-one-dimensional –

ответ

2

Существует нет открытого механизма двухмерного массива, чтобы получить из него один размерный массив.

Если у вас есть зазубренный массив, то это возможно:

int[][] array; 
//populate array 
int[] row = array[1]; 

Если вам нужно иметь многомерный массив, то лучшее, что вы можете сделать, это создать класс для хранения на двухмерную матрицу и а номер строки и выставить индекс для доступа к элементам в этой строке; он может казаться похожим на массив, но на самом деле он не будет таким.

Что-то вроде этого даст вам голые кости; если вы хотите сделать расширение типа IList<T>, вы тоже можете это сделать.

public class ArrayRow<T> : IEnumerable<T> 
{ 
    private T[,] array; 
    private int index; 
    public ArrayRow(T[,] array, int index) 
    { 
     this.array = array; 
     this.index = index; 
    } 

    public T this[int i] 
    { 
     get { return array[index, i]; } 
     set { array[index, i] = value; } 
    } 

    public int Count { get { return array.GetLength(1); } } 

    public IEnumerator<T> GetEnumerator() 
    { 
     for (int i = 0; i < Count; i++) 
      yield return this[i]; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
public static ArrayRow<T> GetRow<T>(this T[,] array, int index) 
{ 
    return new ArrayRow<T>(array, index); 
} 

В качестве альтернативы вы можете скопировать значение каждой строки в многомерном массиве на новый одномерный массив, но и не будут отражать изменения, внесенные в другой.

3

Вы получаете эту ошибку, потому что пытаетесь использовать многомерный массив, как если бы это был зубчатый массив.

Изменить

int[,] 

в

int[][] 

и вам будет хорошо.
Read here about the differences between these types of arrays.

+1

downvoter, помогите объяснить? –

0

Для multidimensional arrays вам необходимо получить доступ к ним, как это:

// access 0,1 
gameObjectData[0,1]; 

// access 5,4 
gameObjectData[5,4]; 

// So in general is 
gameObjectData[x,y]; 

Вы не можете получить доступ к нему, просто давая [х], поэтому для вашего вопроса было бы:

// asuming you want row 0 
int row = 0; 

// this give to g the size of the row of gameObjectData 
int[] g = new int[gameObjectData.getLenght(row)]; 

for (int i = 0; i < gameObjectData.getLenght(row); i++) 
{ 
    g[i] = gameObjectData[row,i]; 
} 
0

Если вам нравятся однострочные линии, вот LINQ один:

int rowIndex = 0; 
firstRow = Enumerable.Range(0, gameObjectData.GetLength(1-rowIndex)) 
        .Select(v => gameObjectData[rowIndex,v]) 
        .ToArray(); 
Смежные вопросы