Из-за двух полей string
в каждой записи TPerson
вы не можете просто использовать двоичный «ход», так как вы испортите счет ссылок string
- особенно в многопоточной среде.
Вы можете сделать это вручную - это быстро и приятно:
TPerson = record
Birthday: TDate;
Name, Surname: string;
end;
TPeople = array of TPerson;
var A, B, C: TPeople;
// do C:=A+B
procedure Sum(const A,B: TPeople; var C: TPeople);
begin
var i, nA,nB: integer;
begin
nA := length(A);
nB := length(B);
SetLength(C,nA+nB);
for i := 0 to nA-1 do
C[i] := A[i];
for i := 0 to nB-1 do
C[i+nA] := B[i];
end;
Или вы можете использовать нашу TDynArray
оболочку, которая имеет метод для обработки таких случаев:
procedure AddToArray(var A: TPeople; const B: TPeople);
var DA: TDynArray;
begin
DA.Init(TypeInfo(TPeople),A);
DA.AddArray(B); // A := A+B
end;
Метод AddArray
может добавить подпорт исходного массива:
/// add elements from a given dynamic array
// - the supplied source DynArray MUST be of the same exact type as the
// current used for this TDynArray
// - you can specify the start index and the number of items to take from
// the source dynamic array (leave as -1 to add till the end)
procedure AddArray(const DynArray; aStartIndex: integer=0; aCount: integer=-1);
Обратите внимание, что для таких записей будет использоваться функция System._CopyRecord
RTL, которая не так оптимизирована для скорости. Я написал более быструю версию - см. эту статью блога или эту ветку форума .
Если вы используете динамические массивы в функциях / процедурах, не забудьте явно использовать параметры const
или var
(как я кодировал выше), в противном случае он будет делать временную копию при каждом вызове, поэтому это может быть медленно.