如何在record
中使用TDictionary
?
TMyRec = record
a: Integer;
b: Integer;
end;
...
dictionary = TDictionary<String, TMyRec>.create();
...
dictionary[key].a := 30;<<<
此处,编译器给出错误:“左侧无法分配给”。我如何解决此问题而又不创建单独的编写myFunc(a, b: Integer): TMyRec
的函数?
答案 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日解决。
该问题的评论已结束:
“这按预期工作。提供了替代的编码样式。”