首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字典中添加新项或更新现有项的方法

在字典中添加新项或更新现有项的方法
EN

Stack Overflow用户
提问于 2010-11-22 19:46:02
回答 6查看 201.9K关注 0票数 265

在一些遗留代码中,我看到了以下扩展方法,以便于添加新的键值项目或更新值(如果键已经存在)。

Method-1 (遗留代码)。

代码语言:javascript
复制
public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{            
    if (map.ContainsKey(key))
    {
        map[key] = value;
    }
    else
    {
        map.Add(key, value);
    }
}

不过,我已经检查过map[key]=value是否做了完全相同的工作。也就是说,此方法可以替换为下面方法-2。

方法2。

代码语言:javascript
复制
public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

我的问题是..。如果我用Method-2替换Method-1会有什么问题吗?它会在任何可能的情况下中断吗?

此外,我认为这曾经是HashTable和字典之间的区别。HashTable允许使用索引器更新项目或添加新项目,而字典不允许!!这种差异在C# > 3.0版本中消除了吗?

此方法的目的不是太抛出异常如果用户再次发送相同的键值,方法应该只用新的值更新条目,如果新的键值对已经发送到方法,则创建一个新的条目。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-22 19:50:14

如果我用Method-2替换Method-1会有什么问题吗?

不,只需使用map[key] = value即可。这两个选项是等效的。

关于Dictionary<>Hashtable:当您启动Reflector时,您会看到两个类的索引器设置器都调用this.Insert(key, value, add: false);,并且add参数负责在插入重复键时抛出异常。因此,两个类的行为是相同的。

票数 286
EN

Stack Overflow用户

发布于 2010-11-22 19:49:41

没有问题。我甚至会从源代码中删除CreateNewOrUpdateExisting,直接在代码中使用map[key] = value,因为这是惯用的C#;C#开发人员通常知道map[key] = value意味着添加或更新。

票数 54
EN

Stack Overflow用户

发布于 2013-11-16 23:40:23

老问题,但我觉得我应该添加以下内容,因为在写这个问题的时候,.net 4.0已经发布了。

从.net 4.0开始,就有了名称空间System.Collections.Concurrent,它包含线程安全的集合。

集合System.Collections.Concurrent.ConcurrentDictionary<>可以做您想要做的事情。它具有AddOrUpdate()方法,并增加了线程安全的优势。

如果你在一个高性能的场景中,并且没有处理多个线程,那么已经给出的map[key] = value的答案会更快。

在大多数情况下,这种性能优势微不足道。如果是这样,我建议使用ConcurrentDictionary,因为:

  1. 它在框架中-它经过了更多的测试,并且您不需要维护代码
  2. 它是可伸缩的:如果您切换到多线程,您的代码已经为它做好了准备
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4245064

复制
相关文章

相似问题

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