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

C# 在字典中使用对象作为键,c#,dictionary,C#,Dictionary,将域对象用作字典中的键是一种好的做法吗 我有一个使用NHibernate填充域对象的场景 为了执行业务逻辑,我需要查找字典。我可以利用 或者 或 第二种选择对我来说似乎更好 如果使用第一个选项,我可以编写更简单的测试用例,并且可以在测试用例中使用真实的域对象,而不是使用Mock,因为Id上的setter在所有域对象上都是私有的 代码的可读性更强,因为Dictionary比Dictionary更具可读性,Dictionary的注释表明int是hobbitId,尤其是作为参数传递时 我的问题是:

将域对象用作字典中的键是一种好的做法吗

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

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

第二种选择对我来说似乎更好

如果使用第一个选项,我可以编写更简单的测试用例,并且可以在测试用例中使用真实的域对象,而不是使用Mock,因为Id上的setter在所有域对象上都是私有的

代码的可读性更强,因为Dictionary比Dictionary更具可读性,Dictionary的注释表明int是hobbitId,尤其是作为参数传递时

我的问题是:

使用第一个选项比使用第二个选项有什么好处,我可能会盲目地忽略这一点

使用第二种方法会有任何性能问题吗?

更新01:

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

使用它们作为密钥是否会出现性能问题?还是我完全没有抓住要点,性能/内存与使用的键无关

更新02:

我的问题是

如果我使用对象作为键而不是基元类型,性能或内存会有任何问题吗?为什么/如何?
您将遇到的最大问题是,在关键点对象作为关键点执行滚动时,不能对其进行变异


当我说mutate时,我的意思是您的key对象必须实现Equals和GetHashCode才能用作字典的键。当对象用作键时,您对该对象所做的任何操作都不得更改GetHashCode的值,也不得使Equals在集合中的任何其他键上的计算结果为true。

您将遇到的最大问题是,在键对象作为键执行滚动时,您不得对其进行变异


当我说mutate时,我的意思是您的key对象必须实现Equals和GetHashCode才能用作字典的键。当对象用作键时,您对该对象所做的任何操作都不能更改GetHashCode的值,也不能使Equals与集合中的任何其他键一起计算为true。

@ScottChamberlain为您提供了总体问题,但您的用例可能会以任何方式进行争论。您应该问自己一些问题:两个业务对象相等意味着什么?如果它们被用作字典中的键,或者如果我在其他地方比较它们,这是相同的还是不同的?如果我更改了一个对象,它作为键的值应该更改还是保持不变?如果对GetHashCode和Equals使用覆盖,那么计算这些函数的成本是多少


一般来说,我赞成对键使用简单类型,因为在对象相等性方面存在很大的误解空间。如果可读性是您最关心的问题,您可以始终使用适当的方法在字典周围创建自定义字典包装器。然后,您可以根据对象编写方法,然后在内部使用您想要的任何适当属性作为键。

@ScottChamberlain为您提供了总体问题,但您的用例可能会有任何争议。您应该问自己一些问题:两个业务对象相等意味着什么?如果它们被用作字典中的键,或者如果我在其他地方比较它们,这是相同的还是不同的?如果我更改了一个对象,它作为键的值应该更改还是保持不变?如果对GetHashCode和Equals使用覆盖,那么计算这些函数的成本是多少


一般来说,我赞成对键使用简单类型,因为在对象相等性方面存在很大的误解空间。如果可读性是您最关心的问题,您可以始终使用适当的方法在字典周围创建自定义字典包装器。然后,您可以根据对象编写方法,然后在内部使用所需的任何适当属性作为键。

您熟悉Dictionary吗。。?它利用键/值对。。同样,它也不允许重复的密钥。。例如,您是否考虑过哈希表。。你的字典看起来更可读,但没有看到任何真正的代码,我很难确定你到底想做什么。你能提供一个例子吗,您想如何具体使用字典?我使用了一种快速而肮脏的方法,使用另一种方法的索引计算数组中的出现次数。您熟悉字典吗。。?它利用键/值对。。同样,它也不允许重复的密钥。。例如,您是否考虑过哈希表。。你的字典看起来更可读,但没有看到任何真实的代码,我很难确定你到底想做什么。你可以提供一个例子,你想如何具体使用字典吗?我使用了一种快速而肮脏的方法,使用另一种方法的索引计算数组中的出现次数是的,
我的域模型确实实现了这些,并且在执行操作时它们不会发生变化。使用它们作为密钥是否会出现性能问题?或者我完全没有抓住要点,性能/内存对使用的密钥没有多大影响?是的,我的域模型实现了这些,并且在执行操作时不会发生变化。使用它们作为密钥是否会出现性能问题?或者我完全没有抓住要点,性能/内存对使用的键没有多大影响?我的另一个担忧是测试业务逻辑。使用域对象使我可以自由编写更简单的测试用例+我建议在听写器周围使用包装器来解决我的问题:我的另一个关注点是测试业务逻辑。使用域对象使我可以自由编写更简单的测试用例+我建议在听写器周围使用包装器来解决我的问题:
IDictionary<int, ValueFortheObject> 
Dictionary<DomainObject, ValueFortheObject>