2010-11-22 40 views
155

在一些遗留代码中,我已经看到以下扩展方法,以便于添加新的键值项或更新值(如果键已经存在)。方法-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; 
} 

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

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

如果用户再次发送相同的键值,该方法的目标不是太抛出异常,该方法应该只更新具有新值的条目,并且如果新键值对已经被创建为新条目发送到该方法。

回答

153

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

不,请使用map[key] = value。这两个选项是相同的。


关于Dictionary<>Hashtable:当你开始反射,看到两个类的索引制定者调用this.Insert(key, value, /* add */ false);add参数负责抛出异常,插入重复键时。所以这两个类的行为都是一样的。

29

没有问题。我甚至会从源代码中删除CreateNewOrUpdateExisting,并在代码中直接使用map[key] = value,因为这样可读性更强,因为开发人员通常会知道map[key] = value的含义。

5

在功能上它们是等效的。

性能明智map[key] = value会更快,因为您只是进行单一查询而不是两个。

风格明智的,更短的在大多数情况下更好:)

代码将似乎在多线程方面做工精细。但它是而不是线程安全,没有额外的同步。

13

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

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

集合System.Collections.Concurrent.ConcurrentDictionary<>正是你想要的。它的AddOrUpdate()方法具有线程安全的附加优势。

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

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

  1. 它是框架 - 它更测试,你是不是谁拥有维护代码
  2. 它是可扩展的一个:如果切换到多线程你的代码已经准备好了吧
相关问题