在循环中从Hashtable中删除项目

时间:2011-09-14 14:07:37

标签: c# .net collections hashtable

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

2 个答案:

答案 0 :(得分:0)

据我所知。只是迭代列表并以任何方式删除密钥有什么问题?如果你必须经常这样做,那就让它成为一个功能......

如果您使用的是.NET Framework 3.5或更高版本,LINQ可能会让您的目标更容易实现。

答案 1 :(得分:0)

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

现在,如果你可以使用.NET 4.0,那么ConcurrentDictionary就很棒了,并且争用更少!如果你继续使用.NET 2.0,我建议使用Dictionary,即使它本身不是你问题的一部分。

更新如果您的应用程序多线程,则无需锁定,但您仍需要构建密钥列表,因为在迭代时调用Remove()使枚举器无效。所以基本上,在你对这个问题发表评论时,你正确地做到了。