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


235

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

方法1(旧版代码)。

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。

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

现在,我的问题是..如果我将Method-1替换为Method-2,会出现任何问题吗?它在任何可能的情况下会破裂吗?

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

如果用户再次发送相同的键值,则此方法的目标不是抛出异常,该方法应仅使用新值更新条目,如果已​​将新的键值对发送给该方法,则创建一个新条目。

Answers:


243

如果我将Method-1替换为Method-2,会出现任何问题吗?

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


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


44

这里没有问题。我什至会CreateNewOrUpdateExisting从源代码中删除该map[key] = value代码,并直接在您的代码中使用,因为这样可读性更好,因为开发人员通常会知道这map[key] = value是什么意思。


22

旧问题,但我觉得我应该添加以下内容,甚至更多,因为在编写问题时.net 4.0已经启动。

从.net 4.0开始,有一个命名空间System.Collections.Concurrent,其中包含线程安全的集合。

该集合System.Collections.Concurrent.ConcurrentDictionary<>完全可以满足您的需求。它具有的AddOrUpdate()方法具有线程安全的附加优点。

如果您处于高性能场景中,并且不处理多个线程,则已经给出的答案map[key] = value会更快。

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

  1. 它在框架中-经过更多测试,您不是必须维护代码的人
  2. 它是可伸缩的:如果您切换到多线程,则您的代码已经准备就绪。

7

在功能上,它们是等效的。

性能方面map[key] = value会更快,因为您只进行一次查找而不是两次查找。

在样式方面,越短越好:)

在大多数情况下,该代码在多线程上下文中似乎可以正常工作。但是,如果没有额外的同步,它就不是线程安全的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.