delphi - 如何最好地将记录添加到 TArray
问题描述
在编写测试程序时,我遇到了这个示例代码:
var MyData: TArray<TDataRec>;
procedure AppendData(AItem: TOrderByCustomer);
var i: Integer;
tmp: TArray<TOrderByCustomer>;
begin
SetLength(tmp, Length(MyData)+1);
for i:=0 to High(MyData) do
tmp[i]:=MyData[i];
tmp[Length(tmp)-1]:=AItem;
MyData:=tmp;
end;
过去,我只是简单地使用 SetLength() 来更改实际数组的长度。为什么这个示例的作者创建了一个临时数组,然后将所有值分配给它并将其复制回原始数组?这是有充分理由的,还是他只是很奇怪?
解决方案
这段代码没有充分的理由。它引入了不必要的复制的潜在开销。函数应该这样写:
procedure AppendData(const AItem: TOrderByCustomer);
var
N: Integer;
begin
N := Length(MyData);
SetLength(MyData, N + 1);
MyData[N] := AItem;
end;
推荐阅读
- c# - 使用 C# DownloadFile() 下载后损坏的 Excel 文件
- r - 使用 R 中的应用在几列上运行 cor.test 时出错
- python-3.x - 有没有办法在 discord.py-rewrite 中找到所有加载和卸载的 cog
- javascript - 使用 jQuery 在 Web 上更改元素
- javascript - ASP.NET Core 3.0:加载 GIF
- angular - Angular datePicker ngx-translate
- postgresql - PostgreSQL 触发器,用于在 table1 中插入一行后在 table2 中插入一个条目(使用 table1 中新插入行的值)
- javascript - 无法让 glidejs 使用 pug 模板
- javascript - 将通用 React 组件转换为 TypeScript 会引发错误
- java - 如何在错误 Spring WebFlux 上调用另一个 api