Почему я не могу создать многомерный массив массивов? - PullRequest
0 голосов
/ 26 мая 2019

Моя программа включает в себя 2-мерную доску: Square[width,height].Каждый квадрат содержит коллекцию пьес.

В слое презентации я хочу представить коллекцию пьес в каждом квадрате и представить каждую пьесу со своей строкой Name.Т.е. string[][width,height].

Объявление string[][,] компилируется без проблем, но я не могу инициализировать переменную:

string[][,] multiArrayOfArrays; //No problemo
multiArrayOfArrays = new string[][8,8]; //Generates errors

Следующие ошибки генерируются для второй строки:

CS1586  Array creation must have array size or array initializer    
CS0178  Invalid rank specifier: expected ',' or ']' ModChess    
CS0178  Invalid rank specifier: expected ',' or ']' ModChess    

В настоящее время я использую List<string>[,] в качестве обходного пути, но ошибки меня раздражают.Почему я могу успешно объявить string[][,], но не инициализировать его?Примечание. Использование VS Community 16.0.4, C # 7.3.

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

string [] [,] multiArrayOfArrays;// Нет проблем

Здесь вы просто объявляете переменную определенного типа.

multiArrayOfArrays = new string [] [8,8];// Генерирует ошибки

И здесь вы фактически создаете новый объект определенного типа.Он генерирует ошибки, потому что это недопустимый синтаксис для инициализации многомерного массива.

Необходимо указать размер для первого измерения [], а затем инициализировать каждый элемент этого массива с помощью string[,].

. Thinkэто как массив массивов:

string[][,] multiArrayOfArrays; //No problemo
multiArrayOfArrays = new string[5][,];//create 5 elements of string[,] array
for (int i = 0; i < multiArrayOfArrays.Length; ++i)
{
    multiArrayOfArrays[i] = new string[8,8];//actually fill elements with string[8,8]
}

или

string[][,] multiArrayOfArrays; //No problemo
multiArrayOfArrays = new string[][,]
{
    new string[8,8],
    new string[8,8],
    new string[8,8],
};
1 голос
/ 26 мая 2019

Вероятно, вы хотите string[,][] a.

string[,][] a = new string[3, 4][];
a[0, 0] = new string[10];
a[0, 1] = new string[4];
a[1, 0] = new string[6];
string s = a[0, 0][2];

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

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


Согласно Jagged Arrays (Руководство по программированию в C #) , int[][,] jaggedArray4 = new int[3][,] "... - это объявление и инициализация одномерного зубчатого массива, который содержит три элемента двумерного массива: разные размеры. "

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