首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发字典的乐观并发删除方法

并发字典的乐观并发删除方法
EN

Stack Overflow用户
提问于 2012-01-04 07:46:38
回答 2查看 996关注 0票数 8

我在ConcurrentDictionary中寻找一个方法,它允许我按键删除一个条目,当且仅当它的值等于我指定的值,类似于TryUpdate,但是对于删除。

唯一这样做的方法似乎是这种方法:

代码语言:javascript
复制
ICollection<KeyValuePair<K, V>>.Remove(KeyValuePair<K, V> keyValuePair)

这是ICollection接口的显式实现,换句话说,我必须先将ConcurrentDictionary转换为ICollection,以便调用Remove。

Remove完全可以做我想做的事情,这个强制转换也没什么大不了的,源代码还显示它用bool matchValue = true调用私有方法matchValue,所以它看起来都很干净。

然而,让我有点担心的是,它并没有被记录为ConcurrentDictionary的乐观并发删除方法,因此http://msdn.microsoft.com/en-us/library/dd287153.aspx只是重复ICollection样板,而如何:从ConcurrentDictionary中添加和删除项也没有提到该方法。

有没有人知道这是路要走,还是还有其他方法,我错过了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-04 14:50:35

虽然它不是正式文档,但这篇MSDN博客文章可能会有所帮助。这篇文章的主旨是:向ICollection进行强制转换并调用其Remove方法,正如在问题中所描述的那样,这是一条可行的道路。

下面是上面博客文章中的一个片段,它将其包装到TryRemove扩展方法中:

代码语言:javascript
复制
public static bool TryRemove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
    if (dictionary == null)
      throw new ArgumentNullException("dictionary");
    return ((ICollection<KeyValuePair<TKey, TValue>>)dictionary).Remove(
        new KeyValuePair<TKey, TValue>(key, value));
}
票数 6
EN

Stack Overflow用户

发布于 2013-11-30 16:48:47

如果您不需要ConcurrentDictionary的所有功能,您可以将您的类型声明为IDictionary。

代码语言:javascript
复制
public class ClassThatNeedsDictionary
{
    private readonly IDictionary<string, string> storage;

    public ClassThatNeedsDictionary()
    {
        storage = new ConcurrentDictionary<string, string>();
    }

    public void TheMethod()
    {
        //still thread-safe
        this.storage.Add("key", "value");
        this.storage.Remove("key");
    }
}

我发现这在只需要添加和删除,但仍然需要线程安全迭代的情况下很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8723585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档