我有一个TDictionary并添加了一些项目:
for index := 0 to 10 do
dict.Add(IntToStr(index), index);
现在,我需要迭代容器并删除我想要的项目:
pairEnum := dict.GetEnumerator;
while pairEnum.MoveNext do
begin
if pairEnum.Current.Value mod 2 = 0 then
dict.Remove(pairEunm.Current.Key);
end;
我希望我现在只有字典中的奇数。但实际上我得到的是:
key=1 value=1
key=3 value=3
key=5 value=5
key=7 value=7
key=9 value=9
key=8 value=8 <-
为什么“8”没有从字典中删除?
如果我添加更多商品。 e.g。
for index := 0 to 12 do
dict.Add(IntToStr(index), index);
然后,结果是正确的。这是为什么?如何正确迭代TDictionary并删除项?感谢。
答案 0 :(得分:3)
在迭代可枚举项时删除项目是不安全的。您应该保留另一个要删除的键列表,并在迭代完成后开始删除它们。
答案 1 :(得分:2)
您需要反向遍历字典。遗憾的是,Delphi默认情况下不提供&#34; For MyObj in dict Reverse&#34;或类似的功能,所以你必须以另一种方式做到这一点:
for ix := dict.Count - 1 downto 0 do
if (dict.Keys.ToArray[ix] mod 2) = 0 then
dict.Remove(dict.Keys.ToArray[ix]);
答案 2 :(得分:0)
迭代中的以下迭代和删除形式似乎有效。
var
Item: TPair<string, integer>;
for Item in dict do
begin
if Item.Value mod 2 = 0 then
dict.Remove(Item.Key);
end;
这可能正常,因为键和值被清空但实际上并没有删除该位置,并且迭代不会丢失,并且可以继续。