Из-за двух полей 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 (как я закодировал выше), иначе он будет делать временную копию при каждом вызове, поэтому он может быть медленным.
person
Arnaud Bouchez
schedule
18.08.2011