如何从字典中删除所有元素?

时间:2011-03-09 07:24:52

标签: c# .net

我使用以下代码从字典中删除所有元素:

internal static void RemoveAllSourceFiles()
        {
            foreach (byte key in taggings.Keys)
            {
                taggings.Remove(key);
            }
        }

但不幸的是,这不起作用,因为抛出了InvalidOperationException。我知道这是因为在迭代时修改了集合,但是我该如何改变呢?

6 个答案:

答案 0 :(得分:33)

更简单(也更有效)的方法:

taggings.Clear();

是的,错误是因为故意更改数据 会破坏迭代器。

答案 1 :(得分:6)

请尝试使用Clear方法。

internal static void RemoveAllSourceFiles()
        {
           taggings.Clear();
        }

更新:正如Marc指出的那样,在修改它时,你无法继续迭代一个集合,因为迭代器无法恢复无效。有关详细信息,请阅读此SO问题的答案。

Why does enumerating through a collection throw an exception but looping through its items does not

答案 2 :(得分:4)

答案 3 :(得分:2)

要执行您想要执行的操作,您将需要反向遍历键,这样您就不会按照尝试返回给您的顺序修改数组。

或者使用.Clear()

答案 4 :(得分:2)

如上所述,.NET默认枚举器在枚举时不支持集合更改。在您的情况下使用清除。

如果想要更好地控制删除,请使用linq:

var deletionList = (from tag in taggings where <where clause> select tag.Key).ToArray();
foreach(var key in deletionList)
{
   taggings.Remove(key);
}

ToArray()扩展方法将枚举LINQ查询,并实例化存储结果的数组。稍后可以安全地枚举此数组,以删除源词典中包含的项目。

答案 5 :(得分:0)

我知道这是一个老问题,但是对于任何正在寻找答案的人,这里有一些选择:

  • 转到list(),然后使用.remove property
  • 将其设置为空/无,然后重新初始化吗?
  • 用Forloop代替foreach吗?
while Dict.Count()
  clDictObject oBj = Dict.Keys.ElementAt(dict.Count -1);
  Dict.Remove(oBj)
end while