如何迭代字典并删除项目?

时间:2013-10-28 04:30:21

标签: delphi-xe2

我有一个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并删除项?感谢。

3 个答案:

答案 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;

这可能正常,因为键和值被清空但实际上并没有删除该位置,并且迭代不会丢失,并且可以继续。