有效地添加到C#.NET字典
我正在生成无数的有效地添加到C#.NET字典,c#,.net,C#,.net,我正在生成无数的对,如果字符串键还没有被使用,我会将它们存储在.NET字典中 效率方面,这样做更好吗 try { Dict.Add(key, val); } catch (ArgumentException) {} //blind attempt 还是这个 if (!Dict.ContainsKey(key)) { Dict.Add(key, val); } //smart attempt 盲尝试触发dup密钥上的异常;聪明的尝试轻触字典索引两次-一次检查,然后
try { Dict.Add(key, val); } catch (ArgumentException) {} //blind attempt
还是这个
if (!Dict.ContainsKey(key)) { Dict.Add(key, val); } //smart attempt
盲尝试触发dup密钥上的异常;聪明的尝试轻触字典索引两次-一次检查,然后再次添加。(在我的特殊情况下,大约有10%的时间使用dup键。)
有人知道一种方法是否应该优先于另一种方法吗?例外是非常昂贵的效率方面的,我主张
智能方法
而不是盲目尝试方法
。尽可能避免例外情况
有关异常效率的详细信息,请阅读。一般情况下的异常:
当成员抛出异常时,其性能可能会慢几个数量级
也就是说,正如安德鲁·巴伯(Andrew Barber)所指出的,这取决于“亿万”是什么,以及你期望碰撞发生的频率
虽然您必须衡量您的性能才能确定,但我个人可能会在等待异常时进行检查,特别是如果您实际上没有做任何事情来处理异常,并且只是计划吞下它。异常通常比“以不会导致异常的方式进行”更昂贵。如果您不关心字典中包含哪些值,可以执行以下操作以避免重复检查和异常
Dict[key] = val;
使用
ConcurrentDictionary
并使用TryAdd()
方法正如在其他答案中提到的,异常处理可能会很慢,因此我会选择ContainsKey
检查。然而,从设计的角度来看,使用异常来控制程序流并不是一种好的做法。一般来说,例外情况应适用于例外情况
如果您认为可能存在重复密钥,请使用
ContainsKey
。如果使用的同一个键暗示系统中某个地方出现重大故障,则异常可能更有意义(尽管您需要对其进行处理,而不仅仅是捕获它)。您确实需要对其进行测试。我猜聪明的方法工作得更快,但那只是一个猜测。这还取决于“亿万”到底是什么。