Всегда не хватало сортировки контейнеров в DAX. Только руки дошли написать.
Навеяно
http://gatesasbait.wordpress.com/200...n-a-container/
можно указывать несколько полей для сортировки (контейнер индексов).
X++:
//class Global
static container quickSort(
container _qsc,
container _cIndexKey = [1],
int _qsstart = 1,
int _qsend = conlen(_qsc)
)
{
int qsi = _qsstart;
int qsj = _qsend;
container qsx;
container qsKey;
boolean less(container _c1, container _c2)
{
int qsk;
int idx;
;
for (qsk=1; qsk<=conlen(_cIndexKey); qsk++)
{
idx = conpeek(_cIndexKey, qsk);
if (conpeek(_c1, idx) < conpeek(_c2, idx)) return true;
if (conpeek(_c1, idx) > conpeek(_c2, idx)) return false;
}
return false;
}
;
qsx = conpeek(_qsc, (_qsstart +_qsend)/2);
do
{
qsKey = conpeek(_qsc, qsi);
while (less(qsKey, qsx))
{
qsi++;
if (qsi <= conlen(_qsc))
{
qsKey = conpeek(_qsc, qsi);
}
else
{
break;
}
}
qsKey = conpeek(_qsc, qsj);
while (less(qsx, qsKey))
{
qsj = qsj - 1;
if (qsi > 0)
{
qsKey = conpeek(_qsc, qsj);
}
else
{
break;
}
}
if (qsi <= qsj)
{
qsKey = conpeek(_qsc, qsi);
_qsc = conpoke(_qsc, qsi, conpeek(_qsc, qsj));
_qsc = conpoke(_qsc, qsj, qsKey);
qsi++;
qsj = qsj - 1;
}
} while (qsi <= qsj);
if (_qsstart < qsj)
{
_qsc = Global::quickSort(_qsc, _cIndexKey, _qsstart, qsj);
}
if (qsi < _qsend)
{
_qsc = Global::quickSort(_qsc, _cIndexKey, qsi, _qsend);
}
return _qsc;
}
Примеры использования:
X++:
container c = [ [2, 3], [5, 2], [1, 2], [20, 2], [10, 2] ];
c = quickSort(c, [2,1]);
//[ [1, 2], [5, 2], [10, 2], [20, 2], [2, 3] ]
c = quickSort(c);
//[ [1, 2], [2, 3], [5, 2], [10, 2], [20, 2] ]