delphi – 具有子列表的记录的通用TList?

delphi – 具有子列表的记录的通用TList?,第1张

概述我想在Delphi XE5中使用带有子列表通用TList记录: type TMyRecord=record Value1: Real; SubList: TList<Integer>; end; TMyListOfRecords=TList<TMyRecord>;var MyListOfRecords: TMyListOfRecords; 无法分配记录字段: 我想在Delphi XE5中使用带有子列表的通用TList记录:

type  TMyRecord=record    Value1: Real;    SubList: TList<Integer>;  end;  TMylistofRecords=TList<TMyRecord>;var  MylistofRecords: TMylistofRecords;

无法分配记录字段:

MylistofRecords[0].Value1:=2.24;

要么

MylistofRecords[0].SubList:=TList<Integer>.Create;

将导致编译器“左侧无法分配”错误.

另见:How to modify TList<record> value?

以下解决方法有效:

AMyRecord:=MylistofRecords[0];AMyRecord.Value1:=2.24;AMyRecord.SubList:=TList<Integer>.Create;AMyRecord.SubList.Add(33);MylistofRecords[0]:=AMyRecord;

由于性能问题,我想避免将数据复制到临时AMyrecord.我宁愿直接访问记录字段和子列表.

处理这个问题的最佳方法是什么?

解决方法 该列表通过 List属性公开其内部存储(动态数组).所以你可以写:

MylistofRecords.List[0].Value1 := 2.24;

与具有价值副本的替代方案相比,这是否会在性能方面产生任何可衡量的差异,我无法分辨.值得检查一下.

正如@LURD所说,List返回内部存储.这可能不仅仅是Count元素.具体来说,它有容量元素.因此,如果您使用它,则必须使用数组索引访问元素,而不是元素0到Count-1.还要记住,对列表大小的修改可能涉及重新分配,因此内部存储可能会移动.您对List的任何引用仅在下次重新分配之前有效.

这些警告应该告诉您,如果性能限制要求,您只考虑使用List.即使这样,也要谨慎使用它.

在我的代码库中,我有替代TList< T>其Items []属性返回指向该元素的指针.容器仍然存储为动态数组,以实现高效的内存布局.我更喜欢List属性的这个选项,因为我觉得它导致更清晰的代码.

好的,你要求查看我的List类,它返回指向元素的指针.这里是:

type  TReferenceList<T> = class(TBaseValueList<T>)  type    P = ^T;  private    function GetItem(Index: Integer): P;  public    property Items[Index: Integer]: P read GetItem; default;  public    // .... helper types for enumerators excised  public    function GetEnumerator: TEnumerator;    function Enumerator(Forwards: Boolean): TEnumeratorFactory;    function ReverseEnumerator: TEnumeratorFactory;    function IndexedEnumerator: TIndexedEnumeratorFactory;  end;

现在,需要一些解释.基类TBaseValueList< T>是我替代TList< T>.你可以用TList替换< T>如果你希望.我没有,因为我的基类没有Items属性.那是因为我希望专门的类能够引入它.我的另一个专业是:

type  TValueList<T> = class(TBaseValueList<T>)  private    function GetItem(Index: Integer): T;    procedure SetItem(Index: Integer; const Value: T);  public    property Items[Index: Integer]: T read GetItem write SetItem; default;  end;

我的TBaseValueList< T>的实现非常明显.它与TList< T>非常相似.我认为你真的不需要看到任何实现.这一切都非常明显.

作为获取元素引用的简单方法,您可以像这样包装List:

type  TMyList<T> = class(TList<T>)  public    type      P = ^T;  private    function GetRef(Index: Integer): P;  public    property Ref[Index: Integer]: P read GetRef;  end;function TMyList<T>.GetRef(Index: Integer): P;begin  Result := @List[Index];end;

如果你想要一套比Delphi更丰富的容器,你可能会关注Spring4D.虽然我不确定他们是否有类似我的容器返回引用.

总结

以上是内存溢出为你收集整理的delphi – 具有子列表的记录的通用TList?全部内容,希望文章能够帮你解决delphi – 具有子列表的记录的通用TList?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1263807.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存