带有子列表的通用记录 TList?

2024-04-26

我想在 Delphi XE5 中使用带有子列表的通用记录 TList:

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

  TMyListOfRecords=TList<TMyRecord>;

var
  MyListOfRecords: TMyListOfRecords;

无法对记录字段进行分配:

MyListOfRecords[0].Value1:=2.24; 

or

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

将导致编译器出现“左侧无法分配给”错误。

也可以看看:如何修改TList值? https://stackoverflow.com/questions/2747446/

以下解决方法有效:

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

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

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


该列表通过以下方式公开其内部存储,这是一个动态数组List http://docwiki.embarcadero.com/Libraries/en/System.Generics.Collections.TList.List财产。所以你可以写:

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

与具有价值副本的替代方案相比,这是否会在性能上产生任何可测量的差异,我无法判断。值得检查一下。

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

这些警告应该建议您只考虑使用List如果性能限制需要的话。即便如此,也要谨慎使用。

在我的代码库中,我有一个替代方案TList<T> whose Items[]属性返回指向该元素的指针。容器仍然存储为动态数组,以实现高效的内存布局。我更喜欢这个选项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。虽然我不确定他们是否有像我的容器一样返回引用的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有子列表的通用记录 TList? 的相关文章

  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 以 png 格式剪辑幻灯片 (Delphi 2010)

    I have a filmstrip of images in png format like this 我想知道如何剪辑每个图像并将这些图像放入 TImageList 控件中 并始终保留透明度 EDIT 是的 在设计时 RRUZ 提到的技
  • Delphi中的抽象类

    我正在使用一个具有许多抽象类的组件套件 现在我想应用多态性 但在创建对象时收到错误抽象类 即使我不需要 我是否应该重写所有虚拟方法 有什么解决方法或解决方案吗 为了创建类的实例 您需要重写所有声明为虚拟抽象的方法 即使您不使用它们 如果您确
  • Scala(或 Java)中泛型函数的特化

    是否可以在 Scala 中专门化泛型函数 或类 例如 我想编写一个将数据写入 ByteBuffer 的通用函数 def writeData T buffer ByteBuffer data T buffer put data 但由于 put
  • 方法返回类型前的 是什么意思?

    下面的方法返回一个List组成T类型元素 public
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • scala 提供类似 C++ 模板的东西吗?

    我来自 C 并试图了解 scala 的类型系统 考虑以下 C 模板类 template
  • Delphi 流畅的界面

    使用上有什么优点和缺点流畅的界面 http en wikipedia org wiki Fluent interface在德尔福 流畅的界面应该会增加可读性 但我对此有点怀疑one包含很多链式方法的长 LOC 是否存在编译器问题 是否存在任
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 如何使用 FieldDefs 在运行时创建新的 SQLite 文件和表?

    我正在使用 Delphi Seattle 在全新的 SQLite 文件中创建一个全新的表 并且仅使用 FieldDefs 和非可视代码 我可以使用 ExecSQL CREATE TABLE 语法创建一个表 但不能如下所示 我得到 没有这样的
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • 从 Delphi VCL 样式获取特定字形

    我想从 VCL 样式获取特定的位图 并将其设置为按钮上的图像 它实际上是帮助问号 在位图样式编辑器中是来自表单的 btnHelp 图像 要从 VCL 样式获取视觉元素 字形 您必须使用GetElementDetails和TCustomSty
  • Lazy 实现和 .NET 泛型

    我正在寻找进行延迟初始化的方法并发现Lazy
  • 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常

    使用 Delphi XE2 Update 3 我在将零字节块上传到 Azure 时遇到问题 当我说零字节时 我指的是每个元素设置为零的字节数组 不是零长度 例如 var ConInfo TAzureConnectionInfo RespIn
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • 类型约束

    我有以下类层次结构 class Header IEnumerable

随机推荐

  • 对 pickle.dump 中的“OSError: [Errno 22] Invalid argument”有什么想法吗?

    下面是我的代码 在此代码中 我尝试将 p 文件拆分并规范化为具有不同规范的文件 然而 似乎分割正在工作 但我无法使用 pickle dump 将它们保存到 p 文件中 对于这个错误有什么建议吗 import numpy as np impo
  • 嵌套和分段的脆皮布局

    TLDR 问题 如何使用 分段 不确定这是否被视为内联 布局和多个模型 有些相关 有些不相关 制作一个脆脆的表单 我正在尝试理解 Django 中的几件事 表单 表单集 嵌套表单和脆皮 我已经研究了一段时间了 感觉我已经很接近了 只是需要有
  • Java String.format() 与 HALF_EVEN 舍入

    我想用String format 将一些 BigDecimal 格式化为字符串的一部分 Example String getPrice String pattern BigDecimal price basePrice multiply B
  • 在 Google App Engine 中,当我将文件写入 blobstore 时,如何减少内存消耗而不超过软内存限制?

    我正在使用 blobstore 来备份和恢复 csv 格式的实体 这个过程对于我所有的小型模型来说都运行良好 然而 一旦我开始处理具有超过 2K 实体的模型 我就超出了软内存限制 我一次只获取 50 个实体 然后将结果写入 blobstor
  • 使用 lapply 和 get 时的 data.table 列顺序

    有人可以帮助我理解为什么下面使用和不使用 get 的两个版本的 lapply 操作不会产生相同的结果吗 当使用 get 时 结果列会混淆 dt lt data table v1 c 1 2 v2 c 3 4 type c A B v1 v2
  • 如何在 yii 模块中添加脚本和样式表

    我是 yii 的新手 我刚刚在 yii 中创建了一个模块 文件结构如下 yii protected modules admin controller model view layout main php css style css imag
  • Python 中带有大稀疏矩阵的 kNN

    我有两个大的稀疏矩阵 In 3 trainX Out 3 lt 6034195x755258 sparse matrix of type
  • 如何使用宏在页面上显示 umbraco 多媒体选择器图像

    大家好 stackoverflow 希望你能帮助我解决一个简单的问题 但在其他地方找不到解决方案 而且我刚刚与 umbraco 合作了一个星期 之前从未使用过 mvc 部分 所以对我来说一切都是新的 所以最大的问题是我如何制作一个宏来显示我
  • 流畅的界面是否会显着影响 .NET 应用程序的运行时性能?

    我目前正忙于为现有技术实现一个流畅的接口 这将允许类似于以下代码片段的代码 using var directory Open Directory path to some directory using var file Open File
  • ArrayList 调整大小

    我有一个 ArrayList 对象 我知道它的确切大小 有什么方法可以指定ArrayList不应该扩展其容量吗 List
  • 将数据库结果转为数组

    我刚刚为组织查询分层数据的 闭包表 方式制作了更新 添加 删除部分 如本幻灯片第 70 页所示 http www slideshare net billkarwin sql antipatterns strike back http www
  • 如何设置http请求的源IP?

    在发送 http 请求之前 我需要设置源 IP 地址 用于 IP 欺骗等 用于建立http连接的类是HTTPURLConnection 我在 stackoverflow 上找到了下面的链接 这非常有用 注册和使用自定义 java net U
  • 使用 Python 重新打开与 Power BI XMLA 端点的连接时出错

    我有以下 python 代码 它在函数运行时工作正常 但在第二次运行时失败 import adodbapi def connect and print input str print Function starting input str
  • 之间有什么区别?

    有什么区别 b and strong i and em 在 HTML XHTML 中 你应该什么时候使用每一个 他们有对普通网络浏览器渲染引擎具有相同的效果 但是有一个根本区别它们之间 正如作者所写讨论列表帖子 https web arch
  • TeamCity:PhantomJS 在 60000 毫秒内没有捕获,杀死

    我在 CI 环境中运行测试时遇到问题 该配置在使用 Node v6 0 0 npm 3 8 6 的 MacOS 10 11 6 El Capitan 上运行良好 但在使用 Node v4 2 2 npm 2 14 7 运行 Windows
  • 当应用程序繁忙时,如何防止用户在闪亮的应用程序上执行任何操作

    我有一个复杂的闪亮应用程序 有很多输入 传单地图等 我遇到的问题是 当应用程序忙于进行一些计算时 用户不断单击应用程序上的任意位置 有时应用程序会崩溃 我想阻止用户在应用程序繁忙时进行任何点击 重要的是 旋转器保持旋转器状态 而不是像在wa
  • 从 Django 缓存中删除特定项目?

    我正在使用站点范围的缓存内存缓存 http en wikipedia org wiki Memcached作为后端 当底层数据库对象更改时 我想使缓存中的页面无效 如果页面名称发生更改 那么我将使整个缓存无效 因为它会影响每个页面上的导航
  • 更改 iis 7 的 Inet 根文件夹

    我面临着一个非常令人恼火的挑战 我必须在生产服务器中部署 ASP NET MVC 3 应用程序 在这个生产服务器中我有两个驱动器C and D 我有权将我的网站放在D 数据文件夹我不能使用C 不幸的是 IIS 创建了Inet目录在C 显然
  • 如何使用 Android 模拟器查找 GPS 位置?

    你好 朋友们 我正在尝试查找 Android 模拟器的当前 GPS 位置 我已经使用了命令 geo fix 但是如果我尝试检索当前位置 它会显示异常 任何人都可以帮助我吗 从模拟器中您无法获取当前位置 你必须自己定位位置 试试这个 C an
  • 带有子列表的通用记录 TList?

    我想在 Delphi XE5 中使用带有子列表的通用记录 TList type TMyRecord record Value1 Real SubList TList
Powered by Hwhale