7

我有一个 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”没有从字典中删除?

如果我添加更多项目。例如

for index := 0 to 12 do
   dict.Add(IntToStr(index), index);

那么,结果是正确的。这是为什么?如何正确迭代 TDictionary 并删除项目?谢谢。

4

3 回答 3

3

在迭代可枚举时删除项目是不安全的。您应该保留另一个要删除的键列表,并在迭代完成后开始删除它们。

于 2013-10-28T09:17:50.933 回答
3

您需要反向遍历字典。不幸的是,默认情况下,Delphi 不提供“For MyObj in dict Reverse”或类似功能,因此您必须以另一种方式执行此操作:

for ix := dict.Count - 1 downto 0 do
  if (dict.Keys.ToArray[ix] mod 2) = 0 then
    dict.Remove(dict.Keys.ToArray[ix]);
于 2017-02-10T02:23:00.947 回答
0

迭代中的以下迭代和删除形式似乎有效。

var
  Item: TPair<string, integer>;

for Item in dict do
begin
  if Item.Value mod 2 = 0 then
    dict.Remove(Item.Key);
end;

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

于 2016-05-15T05:20:14.283 回答