有效地将添加到C#.NET词典中

本文关键字:NET 添加 有效地 | 更新日期: 2023-09-27 18:28:03

我正在生成无数<string,double>对,如果字符串键尚未使用,则将每个对存储在.NET字典中。

就效率而言,这样做更好吗?

    try { Dict.Add(key, val); }  catch (ArgumentException) {} //blind attempt

还是这个?

    if (!Dict.ContainsKey(key)) { Dict.Add(key, val); }       //smart attempt

盲尝试会触发重复密钥的异常;智能尝试点击字典索引两次——一次进行检查,然后再次添加。(在我的特殊情况下,大约10%的时间都有重复密钥。)

有人知道一种方法是否应该优先于另一种方法吗?

有效地将添加到C#.NET词典中

例外情况通常代价高昂:

当成员抛出异常时,其性能可能会降低几个数量级。

也就是说,正如Andrew Barber所指出的,这取决于什么是"无数",以及你预计碰撞发生的频率。

虽然你必须衡量你的性能才能确定,但我个人很可能会在等待异常时进行检查,尤其是如果你实际上没有做任何事情来处理异常,只是计划吞下它。

异常通常比"以不导致异常的方式执行"更昂贵。如果您不关心字典中包含的值,可以执行以下操作以避免双重检查和异常

Dict[key] = val;

从效率角度来看,异常非常昂贵,我主张使用smart approach而不是blind attempt approach。尽可能避免出现异常情况。

请阅读.NET中的True Cost Of Exceptions,了解有关异常效率的详细信息。

使用ConcurrentDictionary<string, double>并使用TryAdd()方法MSDN

正如其他答案中所提到的,异常处理可能很慢,所以我选择ContainsKey检查。然而,从设计的角度来看,使用异常来控制程序流并不是一种好的做法。一般来说,例外情况应用于例外情况。

如果您认为可能存在重复密钥,则使用ContainsKey。如果使用的同一个密钥暗示系统中某个地方发生了重大故障,则异常可能更有意义(尽管您需要对其进行处理,而不仅仅是捕捉它)。