c# - 字典性能提升

标签 c# dictionary

我正在尝试改进一些不久前编写的代码。该功能对系统的核心功能非常重要,因此我对大修持谨慎态度。

我正在使用字典来保存对象

Dictionary<Node, int> dConnections

对象 Node它本身就是一个包含许多属性和一些列表的复杂对象。
这本词典可以容纳大约 100 个或更多条目。

目前正在检查字典是否包含类似的节点
dConnections.ContainsKey(Node)

所以我假设(检查此节点是否在字典中)字典将必须检查整个节点及其属性是否与字典中的节点匹配(它将继续遍历字典直到找到匹配项)这会对性能产生重大影响吗?

我最好不要在字典中使用对象而是使用对象ID。

最佳答案

.NET 字典是 Inside 中的哈希表。这意味着如果 Node 不覆盖 GetHashCode 和 Equals 方法,当您调用 ContainsKey 时,它将匹配:

免责声明:这是一个摘要。事情有点复杂。请不要叫我名字,因为我过于简单化了。

  • Node对象的ref地址的hashcode的一个分区。分区数取决于哈希表的桶数(取决于字典中的键总数)
  • 如果多个节点在同一个存储桶中,则为确切的引用地址。

  • 这个算法非常有效。当您说字典中有 100 个或更多条目时,这不是“很多”。这是几个。

    这也意味着 Node 对象的内容与 ContainsKey 的匹配方式无关。它将与完全相同的引用匹配,并且仅与该引用匹配。

    如果您自己实现 GetHashCode 和 Equals,请注意,当实例属性更改(不可变)时,这些方法返回值不应更改。否则,您很可能会在错误的存储桶中获取 key ,因此完全无法访问(无需枚举整个字典)。

    关于c# - 字典性能提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12893479/

    相关文章:

    c# - 在 devexpress 网格的页脚中显示总行数

    c# - 在 Linq 中处理临时计算

    c# - 在 javascript 函数中添加脚本 src

    作用于一串数字的python map函数

    java - 自定义 equals() 方法无法正常工作

    一个游戏的英文单词列表

    c# - 我如何在 asp.net core 2.2 中实现基于 Cookie 的身份验证和 jwt?

    java - 使用流从 Map 对象列表中仅获取键

    ios - 如何从 UiTableViewCell 更改 View Controller 中字典的值

    c# - 使用 NLog 记录波斯消息