System.Collections.Generic.Dictionary `Add` 与 set `Item`
如果我希望将项目放入System.Collections.Generic.Dictionary
中,我可以Add
或设置Item
。
我知道如果我们执行Add
,它会检查密钥是否已经存在,如果不存在,则会抛出异常。
因此,当添加大量项目时,我是否应该更喜欢设置 Item
而不是 Add
,因为 Add
会进行不必要的检查,实际上可能会减慢速度?
If i wish to put items into a System.Collections.Generic.Dictionary
, I can either Add
or set the Item
.
I know if we do Add
it checks if the key already exists and if not it throws an exception.
So when adding a ton of items, should I prefer setting Item
instead of Add
, since Add
does unnecessary checks that may actually slow things down?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是设置 Item 时发生的情况:
这是添加 item 时发生的情况:
最后一个参数 last bool
add
参数只会影响这一行:因此,如果您希望在添加重复项时出现异常,则可以需要使用添加。如果你想覆盖现有的项目,你需要设置 Item.
Here is what happens when you set Item:
Here is what happens when you add item:
The last parameter last bool
add
parameter just affects this line:So if you want exception when you add a duplicate item, you need to use Add. If you want to overwrite exiting item you need to set Item.
这一切都取决于您是否想要处理重复的键或覆盖任何可能存在的项目。要检查重复项,您可以使用:
例如:
That all depends on whether you want to handle duplicate keys or overwrite any potentially existing item. To check for duplicates you can use:
For example:
抛出异常的成本很低,但处理异常的成本却很高。 try/catch 块的 try 部分像平常一样运行。当执行 catch 块时,它必须展开堆栈以填充堆栈跟踪(除其他外)。这就是异常成本高昂的原因。如果您有办法通过使用诸如
Dictionary.ContainsKey
之类的方法来避免捕获异常,这就是避免捕获异常的原因。您不太可能注意到调用 Add 之间的性能差异和设置项目。因此,请使用最适合具体情况的一种。
更新:
不要优化你的代码,除非它很慢。
Throwing exceptions are cheap, its handling them that is expensive. The try portion of the try/catch block runs like normal. When a catch block is executed, it has to unwind the stack to populate the stack trace (among other things). This is what makes exceptions expensive. This is the reason to avoid catching exceptions if you you have the means to do so by using methods such as
Dictionary<T>.ContainsKey
It is highly unlikely that you will ever notice the performance difference between calling Add and setting Item. So use the one that is most appropriate for the situation.
Update:
Don't optimize your code unless it is slow.