05 November 2010

Concatenating Dynamic Arrays

Another day another unit test and another extension to my little TArrayEx class. This time I found myself having to concatenate some dynamic arrays. After solving the problem for the particular array type I decided to produce a generic solution. Here's the method I came up with:

type
  TArrayEx = class(TObject)
  public
    ...
    class function Concat<T>(const Arrays: array of TArray<T>): TArray<T>;
    ...
  end;

The method takes an array of the arrays you want to concatenate (don't forget the [] notation) and returns the concatenated array. Here's an example where the resultant array A contains the integers 1 to 10 in order:

var
  A, A1, A2, A3: TArray<Integer>;
begin
  A1 := TArray<Integer>.Create(1, 2, 3);
  A2 := TArray<Integer>.Create(4, 5, 6);
  A3 := TArray<Integer>.Create(7, 8, 9, 10);
  A := TArrayEx.Concat<Integer>([A1, A2, A3]);
  ...
end;
Here is the implementation:
class function TArrayEx.Concat<T>(const Arrays: array of TArray<T>): TArray<T>;
var
  A: TArray<T>;
  ResLen: Integer;
  ResIdx, Idx: Integer;
begin
  ResLen := 0;
  for A in Arrays do
    Inc(ResLen, Length(A));
  SetLength(Result, ResLen);
  ResIdx := 0;
  for A in Arrays do
  begin
    for Idx := Low(A) to High(A) do
    begin
      Result[ResIdx] := A[Idx];
      Inc(ResIdx);
    end;
  end;
end;

My other blogs about TArrayEx and working with dynamic arrays are: