TDictionary。在迭代时设置valuetype值

时间:2019-02-22 10:31:10

标签: delphi generics

在迭代时,有没有一种安全的方法来改变字典的值?

第一次尝试:

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.

1 个答案:

答案 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语法完成