How to merge 2 string array in Delphi

后端 未结 3 1077
有刺的猬
有刺的猬 2021-01-04 20:11

I have 2 or more dynamic string array that fill with some huge data , i want to merge this 2 array to one array , i know i can do it with a for loop like this :



        
3条回答
  •  抹茶落季
    2021-01-04 20:30

    You can use built-in Move function which moves a block of memory to another location. Parameters are source and target memory blocks and size of data to be moved.

    Because you are copying strings, source arrays must be destroyed after the merging by filling them with zeroes. Otherwise refcounts for strings will be all wrong causing havoc and destruction later in the program.

    var
      Arr1, Arr2, MergedArr: Array of string;
      I: Integer;
    begin
      SetLength(Arr1, 5000000);
      for I := Low(Arr1) to High(Arr1) do
        Arr1[I] := IntToStr(I);
    
      SetLength(Arr2, 5000000);
      for I := Low(Arr2) to High(Arr2) do
        Arr2[I] := IntToStr(I);
    
      // Set length of MergedArr to length of ( Arra1 + Arr2 )+ 2
      SetLength(MergedArr, High(Arr1)+ High(Arr2)+2);
    
      // Add Arr1 to MergedArr
      Move(Arr1[Low(Arr1)], MergedArr[Low(MergedArr)], Length(Arr1)*SizeOf(Arr1[0]));
    
      // Add Arr2 to MergedArr
      Move(Arr2[Low(Arr2)], MergedArr[High(Arr1)+1], Length(Arr2)*SizeOf(Arr2[0]));
    
      // Cleanup Arr1 and Arr2 without touching string refcount.
      FillChar(Arr1[Low(Arr1)], Length(Arr1)*SizeOf(Arr1[0]), 0);
      FillChar(Arr2[Low(Arr2)], Length(Arr2)*SizeOf(Arr2[0]), 0);
    
      // Test
      for I := Low(Arr1) to High(Arr1) do begin
        Assert(MergedArr[I] = IntToStr(I));
        Assert(MergedArr[I] = MergedArr[Length(Arr1) + I]);
      end;
    
      // Clear the array to see if something is wrong with refcounts
      for I := Low(MergedArr) to High(MergedArr) do
        MergedArr[I] := '';
    end;
    

提交回复
热议问题