在一些遗留代码中,我看到了以下扩展方法,以便于添加新的键值项目或更新值(如果键已经存在)。
Method-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;
}我的问题是..。如果我用Method-2替换Method-1会有什么问题吗?它会在任何可能的情况下中断吗?
此外,我认为这曾经是HashTable和字典之间的区别。HashTable允许使用索引器更新项目或添加新项目,而字典不允许!!这种差异在C# > 3.0版本中消除了吗?
此方法的目的不是太抛出异常如果用户再次发送相同的键值,方法应该只用新的值更新条目,如果新的键值对已经发送到方法,则创建一个新的条目。
发布于 2010-11-22 19:50:14
如果我用Method-2替换Method-1会有什么问题吗?
不,只需使用map[key] = value即可。这两个选项是等效的。
关于Dictionary<>与Hashtable:当您启动Reflector时,您会看到两个类的索引器设置器都调用this.Insert(key, value, add: false);,并且add参数负责在插入重复键时抛出异常。因此,两个类的行为是相同的。
发布于 2010-11-22 19:49:41
没有问题。我甚至会从源代码中删除CreateNewOrUpdateExisting,直接在代码中使用map[key] = value,因为这是惯用的C#;C#开发人员通常知道map[key] = value意味着添加或更新。
发布于 2013-11-16 23:40:23
老问题,但我觉得我应该添加以下内容,因为在写这个问题的时候,.net 4.0已经发布了。
从.net 4.0开始,就有了名称空间System.Collections.Concurrent,它包含线程安全的集合。
集合System.Collections.Concurrent.ConcurrentDictionary<>可以做您想要做的事情。它具有AddOrUpdate()方法,并增加了线程安全的优势。
如果你在一个高性能的场景中,并且没有处理多个线程,那么已经给出的map[key] = value的答案会更快。
在大多数情况下,这种性能优势微不足道。如果是这样,我建议使用ConcurrentDictionary,因为:
https://stackoverflow.com/questions/4245064
复制相似问题