c# - 在字典中使用对象作为键

标签 c# dictionary

将域对象用作字典中的键是一种好习惯吗?

我有一个场景,我使用 NHibernate 填充我的域对象.

为了执行业务逻辑,我需要查找字典。我可以利用 要么

IDictionary<int, ValueFortheObject> 

Dictionary<DomainObject, ValueFortheObject>

第二个选项对我来说似乎更好

  1. 我可以编写更简单的测试用例,并且可以在测试用例中使用真实的域对象,而不是使用 Mock<DomainObject> (如果我选择第一个选项)因为 setter 在 Id 上是private在所有域对象上。

  2. 代码的可读性更高为Dictionary<Hobbit,List<Adventures>>对我来说比 Dictionary<int,List<Adventures>> 更具可读性评论暗示 int 是 hobbitId特别是作为参数传递时

<罢工> 我的问题是:

    <罢工>
  1. 使用第一个选项比使用第二个选项有什么优势(我可能会盲目地错过)?

  2. 使用第二种方法会有性能问题吗?

更新 01:

我的领域模型实现了这些,并且在执行操作时它们不会发生变化。

使用它们作为键会有性能问题吗?还是我完全忽略了这里的要点,性能/内存与正在使用的键无关?

更新 02:

我的问题是

  1. 如果我使用对象而不是原始类型作为键和为什么/如何,性能或内存会不会有任何问题?

最佳答案

您将遇到的最大问题是您不能在 key 对象作为 key 执行滚动时更改 key 对象。

当我说“变异”时,我的意思是您的键对象必须实现 EqualsGetHashCode 才能用作字典的键。当对象用作键时,您对该对象所做的任何操作都不得更改 GetHashCode 的值,也不得导致 Equals 与集合中的任何其他键一起评估为 true。

关于c# - 在字典中使用对象作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894935/

相关文章:

python - 使用字典时如何避免 KeyError?

c# - 使用 Dapper 多次执行存储过程?

c# - 如何将一个 TXT 文件从 Assets 文件夹复制到 SD/内部存储 Android C# Xamarin

c# - 在 foreach 循环内设置用户控件的属性

c# - 去除耦合然后模拟单元测试

c# - for 循环 - "Unreachable code detected"- 测试

java - 如何在没有 [...] 和 , 分隔符的情况下打印 Map 中的值(字符串)?

c++ - 如何正确删除指针映射作为键?

python - 遍历嵌套字典

python - python manager dict 会自动锁定它的值吗?