Array vs Map
Вообще, это похожие структуры - коллекции.
Насколько можно судить из работы класса Array, при вставке записи по большому индекску, генерируются дефолтные значения для всех индексов с незаполненными значениями до него.
То есть если в качестве индекса для массива использовать recId текущей записи (потому что нам все таки нужно уникальная идентификация строки), то массив будет всегда получаться очень большой.
Можно выполнить нижеприведенный job для сравнения.
И как говорится, извините, если Ваша Ахапта упадёт из-за Out of Memory во втором случае
X++:
static void Job35(Args _args)
{
Array arr = new Array(Types::Integer);
Map map = new Map(Types::Integer, Types::Integer);
;
map.insert(92332432, 32432);
print "map inserted";
pause;
print map.lookup(92332432);
print map.exists(32432);
print map.exists(1);
pause;
arr.value(92332432, 32432);
print "Array inserted";
pause;
print arr.value(32432);
print arr.value(1);
print arr.exists(250);
pause;
}
Более того, в DAX 4.0 тип для индекса остался int, в то время, как тип для RecId стал Int64. То есть использовать RecId в качестве индекса на 4ке уже не корректно.
С Map таких проблем нет, так как мы сами указываем тип ключевого поля. и они вставляются последовательно (сортированно), и значение ключевого поля не пугает величиной.
------
Но, и в том и в другом случае при переходе между строками, необходимо делать проверку существования значения, что сказывается на производительности.
+ кушает память (при большом кол-ве записей, если мы пройдемся по ним)
Я использую Map, когда необходимо выбрать небольшое кол-во значений. Но это - IMHO.