在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); } } 

虽然,我已经检查过map[key]=value是否完全一样的工作。 也就是说,这个方法可以用下面的方法-2代替。

方法2。

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

现在,我的问题是..如果我通过方法2replace方法1可以有任何问题吗? 它会在任何可能的情况下打破?

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

如果用户再次发送相同的键值,则此方法的目的不是太抛出exception,方法应该只更新具有新值的条目,并且如果已经将新键值对发送到方法,则创build新条目。

如果我用Method-2replaceMethod-1,会不会有问题?

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

关于Dictionary<>Hashtable :当你启动Reflector时,你会发现两个类的索引器setter调用this.Insert(key, value, /* add */ false);add参数负责在插入重复键时抛出一个exception。 所以这两个类的行为是一样的。

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

老问题,但我觉得我应该补充以下内容,甚至更多,因为.NET 4.0已经在问题编写的时候启动。

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

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

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

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

  1. 这是在框架 – 它是更多的testing,你不是谁必须维护代码
  2. 它是可扩展的:如果你切换到multithreading,你的代码已经准备好了

在function上,它们是等价的。

性能明智的map[key] = value会更快,因为你只做单一的查找,而不是两个。

风格明智,越短越好:)

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