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;
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:
Hi, under what license is the code on this blog licensed? I know there is some sort of license on the code in the Code Snippet Repository, but I cannot find this implementation of the routine there.
ReplyDeleteThanks for the blog post
This is just example code, so feel free to do want with it.
ReplyDeleteI have a draft TArray class that I intended to add to the Code Snippets database, but never got round to. If it ever gets released that code, like everything in the database, will be MIT licensed.