记录在TDictionary中

时间:2018-11-30 06:26:24

标签: delphi delphi-xe

如何在record中使用TDictionary

TMyRec = record
    a: Integer;
    b: Integer;
end;

...

dictionary = TDictionary<String, TMyRec>.create();

...

dictionary[key].a := 30;<<<

此处,编译器给出错误:“左侧无法分配给”。我如何解决此问题而又不创建单独的编写myFunc(a, b: Integer): TMyRec的函数?

3 个答案:

答案 0 :(得分:2)

filterWigetOptions返回字典保存的记录的副本。编译器禁止您对其进行修改,因为它毫无用处。

顺便说一句,该程序的较旧版本将接受您的代码,并且对记录的修改将丢失,这非常令人困惑。您将进行分配,但是没有可见的更改,因为您分配的是一个无名的局部变量。

很显然,您打算修改集合中保存的记录。为此,您需要分配整个记录。将记录从集合中读取到局部变量中。修改局部变量。将更新后的值写回到集合中。像这样:

dictionary[key]

一个令人沮丧的方面是,即使我们知道第二个将查找与第一个相同的记录,该代码也需要执行两次字典查找。甚至强大的Spring4d词典也无法通过一次查找来完成此任务。

答案 1 :(得分:2)

David Heffernans answer是您的追求,但我想再提一个警告。记录可以具有与类一样的属性,具有getter和setter,并且如果记录具有此类属性,则代码可以编译,但仍不会更改实际记录值。

TMyRec = record
private
  FA : integer;
  procedure SetA(const Value: integer);
  function GetA : integer;
public
  { Warning: When used on result from dictionary lookup, only the COPY will be 
    altered, not the actual record in the dictionary! }
  property A : integer read GetA write SetA; 
end;

答案 2 :(得分:0)

一个非常简单的解决方法是使用记录的List属性。

您可以说:

dictionary.list[key].a := 30;

这将通过List属性访问备份TList的动态数组。编译器已经支持直接访问动态数组。

如果您可以登录quality.embarcadero.com,则可以看到以下有关该问题的完整讨论:RSP-23136: We should be able to assign a value to one element in a list of records-发布于2018年12月18日并于2019年11月21日解决。

该问题的评论已结束:

“这按预期工作。提供了替代的编码样式。”