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,因为:
小智 13
唯一的问题可能是如果有一天
map[key] = value
Run Code Online (Sandbox Code Playgroud)
将转变为 -
map[key]++;
Run Code Online (Sandbox Code Playgroud)
这将导致KeyNotFoundException
.
在功能上,它们是等价的.
性能方面map[key] = value
会更快,因为您只进行单次查找而不是两次查找.
风格方面,越短越好:)
在大多数情况下,代码似乎在多线程上下文中工作正常.但是,如果没有额外的同步,它不是线程安全的.