Зубчатые многомерные массивы в C#

Примечание. Я определяю «зубчатое многомерное изображение» именно как jmArray[][,].

Я пытаюсь обдумать использование этого типа массива, чтобы хранить простые координаты, пару целых чисел. Этот массив будет использоваться для создания сетки 3x3, поэтому в голове я вижу:

jmArray[N][X,Y]

Где N — номер среза сетки, а X, Y — координаты среза. Так:

jmArray[2][3,2]

Это будет означать, что срез 2 лежит в координатах 3,2.

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

jmArray[0][,] = new int[1,2] {{3,3}};

Было бы неплохо немного помочь в понимании того, как это сделать правильно.


person Si-Malik    schedule 19.03.2014    source источник


Ответы (3)


Если я вас не понимаю, более простой способ сделать это - создать словарь кортежей размера 3.

var space = Dictionary<Tuple<int, int, int>, TPointValue>;

// Fill up space with some points
space[Tuple.Create(3,3,1)] = new TPointValue(42);

// Retrieve point from 3d space
TPointValue point3string1 = space[Tuple.Create(3,3,1)];

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

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

PS: обратите внимание, что значение в точке не обязательно должно быть каким-то причудливым типом, таким как TPointValue, это может быть просто string или float или что угодно.

person Asad Saeeduddin    schedule 19.03.2014
comment
Для меня это похоже на JS, но я буду работать с ним. - person Si-Malik; 20.03.2014

Вы можете добиться этого следующим образом:

int[][,] jmArray = new int[3][,];
jmArray[0] = new int[1,2] {{3,3}};
person recursive    schedule 19.03.2014

Вместо сложного массива лучше подойдет простой класс с осмысленными именами:

class Slice
{
    int X = 0;
    int Y = 0;
    public Slice()
    {
    }
    public Slice(int _X, int _Y)
    {
        X = _X;
        Y = _Y;
    }
}

Slice[] Slices = new Slice[9];

Индекс массива будет позицией среза.

person tinstaafl    schedule 19.03.2014