【发布时间】:2021-06-22 06:45:36
【问题描述】:
我有以下代码和两个字典。我可以看到,当我遍历 DictForbidden 时,即使它是空的,执行流程也会进入循环,所以 DictToAdd.remove(anInteger);执行与 anInteger 的旧值
var DictForbidden, DictToAdd : TDictionary<Integer,boolean>;
var anInteger: Integer;
DictForbidden := TDictionary<Integer,boolean>.Create;
DictToAdd := TDictionary<Integer,boolean>.Create;
anInteger := 1;
DictToAdd.Add(anInteger,true);
for anInteger in DictForbidden.Keys do
DictToAdd.remove(anInteger);
DictForbidden.Free;
DictToAdd.Free;
我正在运行 Delphi 10.4,但我不记得在 10.3 中有这样的行为。我想当时如果字典为空,则没有输入循环。你知道这是否是 Delphi 10.4 上的新功能?或者我在这里做错了什么?
问候,卡洛斯
【问题讨论】:
-
你没有做错任何事,这在我的 10.3 上按预期工作。目前无法访问 10.4。
-
您确定确实调用了
Remove吗?如果将ShowMessage(DictToAdd.Count.ToString)放在循环之后、清理之前会发生什么? -
@AndreasRejbrand:在任何情况下它都可能报告 1,因为不能保证(即使它循环一次)它会删除值 1 - 它可能(如果编译器中存在错误) ) 在任意随机值处使用 anInteger 循环一次。最好在循环中包含一个“可见”语句,以查看循环的内部是否正在执行...
-
@HeartWare:正确,我的错。
-
在列表中迭代时删除一个项目不幸的是给迭代器带来了一些麻烦。我建议使用反向 for 循环,以便使用 for-down-to 进行迭代或编写一个 while 循环。
标签: dictionary delphi iteration