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

Man*_*ani 209 c# dictionary

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

方法-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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

方法2.

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

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

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

如果用户再次发送相同的键值,则此方法的目标不是抛出异常,该方法应该只使用新值更新条目,并且如果已将新的键值对发送到该方法,则创建新条目.

ulr*_*chb 217

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

不,只是使用map[key] = value.这两个选项是等价的.


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


Ste*_*ven 43

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


Lui*_*ipe 17

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

从.net 4.0开始,命名空间System.Collections.Concurrent包含线程安全的集合.

该系列System.Collections.Concurrent.ConcurrentDictionary<>完全符合您的要求.它具有AddOrUpdate()线程安全的附加优点.

如果您处于高性能场景而不处理多个线程,那么已经给出的答案map[key] = value会更快.

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

  1. 它在框架中 - 它经过了更多测试,您不是必须维护代码的人
  2. 它是可扩展的:如果你切换到多线程,你的代码已经准备好了


小智 13

唯一的问题可能是如果有一天

map[key] = value 
Run Code Online (Sandbox Code Playgroud)

将转变为 -

map[key]++;
Run Code Online (Sandbox Code Playgroud)

这将导致KeyNotFoundException.


ya2*_*a23 6

在功能上,它们是等价的.

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

风格方面,越短越好:)

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