Вы можете извлечь уникальные значения, используя Set
, затем отсортировать их (поскольку сортировка массива массивов более сложна), затем использовать array.reduce
, чтобы получить все элементы в исходном массиве, и нажать либо одно значение, если уникальное в противном случае массив значений (не знаю, зачем вам это нужно, но все же ..)
Дополнительная справочная документация:
Рабочий код ниже:
let arr = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];
// I want to create this [[1,1,1,1],[2,2,2], 4,5,10,[20,20], 391, 392,591]
console.log([...new Set(arr)].sort((a,b) => a - b).reduce((accumulator, next) => {
const filtered = arr.filter(i => i === next);
return accumulator.push(filtered.length === 1 ? filtered[0] : filtered), accumulator
}, []));
[ 1113]
При передаче указателя на управляемый класс затем, легко преобразовать ^ ссылку в указатель, но необходимо прикрепить управляемый объект так, чтобы GC не переносил его в памяти (таким образом делающий недействительным указатель)
Это просто с pin_ptr
Однако Ваш код делает две вещи, которые не будут работать
RTPClient::RTPClient():
mClient(NULL)
{
CIsmaClient::Create(
&mClient, // 1
NULL,
&AllocBuffer,
&GetDataPointer,
this); //2
}
1) Вы пытаетесь взять адрес чего-то на управляемой "куче" (местоположение указателя на указатель mClient находится на управляемой "куче".
Как таковой это может переместиться в память, таким образом внутренний указатель поставщика компилятора (чье значение сохраняется по операциям GC). Это должно быть прикреплено, и это будет только работать, если Создать функция не будет ожидать использовать указатель после того, как это будет объем, закончился (если это передаст его куда-нибудь еще для хранения его, то это приведет к ошибкам).
2) Вы передаете дескриптор (забавный символ шляпы), а не указатель. (Считайте раздел Википедии по ним, они - хороший обзор), Это не (и не может) быть понятым под неуправляемым кодом.
Единственная причина, о которой я могу думать для этого параметра в этом контексте, состоит в том, поскольку явная переменная состояния передала последующим функциональным обратным вызовам (исправьте меня, если я неправ). 'это' в этом контексте никогда не собирается работать правильно, так как это может переместиться в памяти, после того как pin_ptr выходит из объема.
С этим в памяти вот (частично) исправленная реализация, проясняющая, что может и не может быть зафиксировано.
RTPClient::RTPClient():
mClient(NULL)
{
// make it clear you want the address of the instance variable
pin_ptr<CIsmaClient*> pinnedClient = &this->mClient;
CIsmaClient::Create(
pinnedClient, // fixed
NULL,
&AllocBuffer,
&GetDataPointer,
x /* pass something else in */); //2
}
Если Вы предоставляете больше информации о том, что используется последний параметр, поскольку я могу предложить возможные решения