C# 如何从字典中删除所有元素?
我使用以下代码从字典中删除所有元素:C# 如何从字典中删除所有元素?,c#,.net,C#,.net,我使用以下代码从字典中删除所有元素: internal static void RemoveAllSourceFiles() { foreach (byte key in taggings.Keys) { taggings.Remove(key); } } 但不幸的是,这不起作用,因为抛出了invalidoOperationException。我知道这是因为在
internal static void RemoveAllSourceFiles()
{
foreach (byte key in taggings.Keys)
{
taggings.Remove(key);
}
}
但不幸的是,这不起作用,因为抛出了invalidoOperationException
。我知道这是因为在对集合进行迭代时对其进行了修改,但如何更改呢?一种更简单(也更高效)的方法:
taggings.Clear();
是的,错误是因为更改数据故意中断迭代器。尝试使用该方法
internal static void RemoveAllSourceFiles()
{
taggings.Clear();
}
更新:正如Marc指出的,在修改集合时不能继续对集合进行迭代,因为迭代器已不可恢复地失效。有关详细信息,请阅读此问题的答案
?要执行您想要执行的操作,您需要反向迭代键,这样您就不会按照数组试图返回给您的顺序修改数组
或者使用.Clear()如上所述,.NET默认枚举器在枚举时不支持集合更改。在您的情况下,请使用Clear 如果希望更好地控制删除,请使用linq:
var deletionList = (from tag in taggings where <where clause> select tag.Key).ToArray();
foreach(var key in deletionList)
{
taggings.Remove(key);
}
var deletionList=(从标记中的标记中选择tag.Key);
foreach(删除列表中的变量键)
{
标记。移除(键);
}
ToArray()扩展方法将枚举LINQ查询,并实例化存储结果的数组。稍后可以安全地枚举此数组以删除源词典中包含的项。我知道这是一个老问题,但对于任何正在寻找答案的人,这里有一些选项:
- 转到
,然后使用list()
。删除属性
- 将其设为空/无并重新设置
- Forloop而不是foreach
更准确地说,您不能在修改后继续迭代它;细微的差别,也许。。。但是你可以修改这个收藏。谢谢马克指出。是的,细微但重要的区别。注意:虽然在这种情况下,
Clear
更有意义,但在一般情况下,您可以通过迭代键列表的副本来解决此问题,例如,使用foreach(taggings.keys.ToList()中的字节键)
。谢谢,这对我很有帮助。在我的情况下,Clear
方法不起作用,因为我需要在删除项目时触发一些事件。
while Dict.Count()
clDictObject oBj = Dict.Keys.ElementAt(dict.Count -1);
Dict.Remove(oBj)
end while