如何使用通用 TList 列表属性

Posted

技术标签:

【中文标题】如何使用通用 TList 列表属性【英文标题】:How to use generic TList List property 【发布时间】:2014-12-22 12:05:31 【问题描述】:

DelphiXE7 更新1

在尝试使用 TList.List 属性时,我注意到一个奇怪的行为。如果你看下面的代码,似乎 MyList1.List 返回的数组大小不正确......那么,哪里有 bug?是在我的代码/头中还是在 RTL 中;-)

var
  MyList1, MyList2: TList<String>;
begin
  MyList1 := TList<String>.Create;
  MyList2 := TList<String>.Create;

  MyList1.Add('A');
  MyList1.Add('B');
  MyList1.Add('C');

  MyList2.AddRange(MyList1.List);   // MyList1.Count = 4 !!!!

  ShowMessage(Format('%d, %d', [MyList1.Count, MyList2.Count]));
end;

【问题讨论】:

只使用MyList2.AddRange(MyList1);List 是一个不应该是 public 的属性,恕我直言。无论如何,thisthis 是您可能感兴趣的。 TLama。你太快了 ;-) 我刚刚编辑了代码以重新表述“真正的”问题。不是分配本身,而是错误的 (?) TList.List 属性。 那你可以看看this question 好的,我现在完全明白了。谢谢 这是一个 RTL 设计缺陷。 List 属性读取 FList 字段,而它应该调用 ToArray 方法。 【参考方案1】:

List 属性是原始的底层存储。该类作为减少重新分配次数的优化,会过度分配此存储。这具有List 返回的数组可能比列表本身具有更多元素的效果。然后,您可以添加更多项目,而无需强制重新分配,直到达到容量。

因此,这种行为是意料之中的。使用Count 找出列表中有多少项已定义。

【讨论】:

以上是关于如何使用通用 TList 列表属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用通用 TList 的 OnNotify

如何使用mormot将通用TList序列化为JSON

如何替换通用列表中每个实例的交换 2 个属性?

如何从同一平面列表中的另一个项目更改平面列表中项目的状态?

根据两个或多个值对通用列表进行排序

Delphi,如何在 TList 中释放记录