Создание массива двумерных массивов в С#

Я просто хочу создать массив двухмерных массивов для хранения координатных точек.

Итак, я хочу массив, в котором каждый индекс возвращает двухмерный массив, который я бы использовал как x и y.

Вот что я пробовал:

waypoints = new int[4][,]    {
        {{0},{6, 0}},
        {{1},{1, 1}},
        {{2},{1, 5}},
        {{3},{6, 5}}
    };

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

Это дает ошибку:

"CS0623: Инициализаторы массива могут использоваться только в переменной или инициализатор поля. Попробуйте вместо этого использовать новое выражение

Я также пробовал сделать это вот так:

waypoints = new int[4][,] {
        new int[,] {6, 0},
        new int[,] {1, 1},
        new int[,] {1, 5},
        new int[,] {6, 5}
        };

Это дает ошибку:

"CS0846: ожидался инициализатор вложенного массива

Ответы

Ответ 1

В начальном объявлении требуется еще один набор фигурных скобок {}:

var waypoints = new int[4][,]   {
    new int[,] {{6}, {0}},
    new int[,] {{1}, {1}},
    new int[,] {{1}, {5}},
    new int[,] {{6}, {5}}
};

Это связано с тем, что для такого массива 2D каждый элемент массива рассматривается как массив для инициализации (хотя он обычно используется для каждого элемента массива, такого как val[0,0] = 4;).

Изменить (после комментариев от комментариев):

Поставить в отличие от int[][] (известный как jagged array, то есть: массив массивов, элемент массива которых может быть разный размер), int[,] является двумерным массивом с фиксированным размером. Оба являются массивами, которые хранят массивы, и поэтому каждый элемент массива представляет собой массив. Это объясняет, почему существует необходимость вставить еще одну фигурную скобку в свою инициализацию, как указано выше.

Такой 2D-массив, при инициализации по-разному, приведет к разной размерности (и, следовательно, существует несколько способов его инициализации):

int[,] val = new int[,] { { 6 }, { 0 } }; //resulting in int[2,1]
int[,] val = new int[,] { { 6, 0 } }; //resulting in int[1,2]

В любом случае требуется дополнительный набор фигурных скобок.

Для различий между jagged array и многомерным, фиксированным размером, массивом есть уже много good пояснения/бенчмаркинг доступно онлайн из хорошо известных источников. И я понимаю, что для меня не было бы значительным, кроме интереса OP, больше узнать об этом. (И, следовательно, область для этого ответа изначально предназначена только для ответа на неудачную инициализацию).

Понятно, что решение лучше не использовать для хранения координатных точек (как это делает OP). Объяснение, приведенное выше, дается, чтобы объяснить, почему его инициализация не работает, а не предоставлять лучшее решение для хранения координатных точек. Что касается сохранения координатных точек, Point в System.Drawing struct будет более правильным (как указано в комментарии).

Использование 2D-массива для представления одной точки в 2D Декартовой координаты является "избыточным" , поскольку 1D-массив уже способен сохраняя столько чисел, сколько позволяет компьютер, для хранения точек в декартовой системе координат требуется больше двух чисел.

Ответ 2

Там есть простой ответ. Используйте экземпляры класса "System.Drawing.Point". Создайте массив "Точка" для хранения координат. Чтобы создать массив:

Point[] points = new Point[4];

И чтобы назначить значение массиву (например, в позиции 0), используйте следующий код.

points[0] = new Point(xvalue,yvalue);//Where "xvalue" and "yvalue" are integer variables.

И получить значения X и Y из экземпляра точечного класса. Используйте приведенный ниже код.

int xvalue = points[0].X;

int yvalue = points[0].Y;

P.S. Вы можете использовать эти точки для назначения мест элементам управления, но эта другая история ^ _ ^

Ответ 3

Массивы двумерные и имеют неизвестный размер, инициализатор может определять массивы различных размеров:

        var waypoints = new int[4][,]   {
                new int[,] { {1, 2, 6}, {3, 4, 5} }, // two rows, 3 columns
                new int[,] { {1, 1}, {1, 2} } , // 2 x 2
                new int[,] { {1, 5} }, // 1 x 2
                new int[,] { {6, 5} }
                };