在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,因为:
- 这是在框架 – 它是更多的testing,你不是谁必须维护代码
- 它是可扩展的:如果你切换到multithreading,你的代码已经准备好了
在function上,它们是等价的。
性能明智的map[key] = value
会更快,因为你只做单一的查找,而不是两个。
风格明智,越短越好:)
在大多数情况下,代码似乎在multithreading上下文中工作正常。 但是,如果没有额外的同步,它不是线程安全的。