Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字典中删除所有元素?_C#_.net - Fatal编程技术网

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