Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有效地添加到C#.NET字典_C#_.net - Fatal编程技术网

有效地添加到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密钥上的异常;聪明的尝试轻触字典索引两次-一次检查,然后

我正在生成无数的对,如果字符串键还没有被使用,我会将它们存储在.NET字典中

效率方面,这样做更好吗

    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
。如果使用的同一个键暗示系统中某个地方出现重大故障,则异常可能更有意义(尽管您需要对其进行处理,而不仅仅是捕获它)。

您确实需要对其进行测试。我猜聪明的方法工作得更快,但那只是一个猜测。这还取决于“亿万”到底是什么。