c# - 在循环中从哈希表中删除项目

标签 c# .net collections hashtable

除了先将键保存在列表中然后遍历该列表并逐一删除每个项目之外,是否有更好的方法根据条件从哈希表中删除多个项目?通用列表提供了一个“RemoveAll”方法,我可以将匿名函数传递给该方法,但似乎没有 HashTable 的等效方法。注意:我使用的是 .NET Framework 2.0

最佳答案

这实际上取决于您的应用程序。如果您的应用程序是多线程的并且是 pre .NET 4.0,通常最好使用 ReaderWriterLock/ReaderWriterLockSlim 并获得读取器锁,构建所需 key 的列表删除,然后升级为写锁,并在列表上执行循环以删除 key 。这样,当您遍历 Hashtable 以删除键时,其他读者可以访问它而不会被锁定。

现在,如果您可以升级到 .NET 4.0,ConcurrentDictionary 将非常出色并且竞争更少!如果您继续使用 .NET 2.0,我会推荐 Dictionary,即使它本身不是您问题的一部分。

UPDATE 如果您的应用程序不是多线程,不需要锁定,但您仍然需要构建键列表,因为在迭代时调用 Remove()使枚举器无效。所以基本上,根据您对问题的评论,您的做法是正确的。

关于c# - 在循环中从哈希表中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7417710/

相关文章:

java - 多值 HashMap 值的 "Size or zero"

c# - 如何检查当前登录的用户是否正在使用漫游配置文件?

asp.net - 在ASP.NET中长时间运行的后台进程-Application_Start还是单独的进程?

c# - 在枚举中使用字符串

c# - 在代码中使用 Hangfire job id

java - 为什么我们使用 entrySet() 方法并使用返回的集合来迭代 map ?

java - 使用 Comparable 接口(interface)的匿名内部类

c# - 使用 aff 文件时出现 System.EntryPointNotFoundException

c# - Firefox 没有 Access-Control-Allow-Origin,但适用于 Chrome 和 Safari

c# - 有没有删除cosmos DB文档的c#代码