我使用以下代码从字典中删除所有元素:
internal static void RemoveAllSourceFiles()
{
foreach (byte key in taggings.Keys)
{
taggings.Remove(key);
}
}
但不幸的是,这不起作用,因为抛出了InvalidOperationException
。我知道这是因为在迭代时修改了集合,但是我该如何改变呢?
答案 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
。foreach
吗?while Dict.Count()
clDictObject oBj = Dict.Keys.ElementAt(dict.Count -1);
Dict.Remove(oBj)
end while