在迭代时,有没有一种安全的方法来改变字典的值?
第一次尝试:
var p: tpair<keytype,valuetype>;
begin
for p in coll do
// p.value is readonly for valuetypes and their fields.
end;
失败,并且将valuetype包装在RECORD中也无济于事。
遍历键并使用dosetvalue可能有效,但这只是私有的。
我当然可以使用引用类型,但这对我来说有点傻,因为状态是整数。不优雅。
添加的完整示例:
program gendicttest;
// tests if you can set valuetype key.
{$APPTYPE CONSOLE}
uses
generics.collections;
type
TCycleList = tdictionary<integer,integer>; // the value a record type doesn't work either.
var cyclelist :TCycleList;
p : tpair<integer,integer>;
j:integer;
begin
cyclelist:=tcyclelist.Create;
cyclelist.Add(3,4);
for p in cyclelist do
writeln(p.Key, ' ',p.Value);
if cyclelist.TryGetValue(3,j) then
cyclelist.AddOrSetValue(3,j+1);
for p in cyclelist do
p.Value:=0; // <-- here, and alternative to do this.r
for p in cyclelist do
writeln(p.Key, ' ',p.Value);
end.
答案 0 :(得分:1)
当然不能用!返回的对是副本。因此,您最多只能修改副本,这没有任何意义。
如果只想清除这些值,则获取键的副本并枚举它们以将每个键的值设置为0。
for var I in cycleList.Keys do
cycleList.AddOrSetValue(I, 0);
或者,您可以使用可以通过键索引的项目:
for var I in cycleList.Keys do
cycleList.Items[I] := 0;
注意:也可以不用Rio语法完成