0

我正在开发一个包含几个类的简单应用程序。这一切都始于我想RemoveList<Car>. 此方法要求您覆盖该类型的EqualsGetHashCode方法Car。在这种情况下,我决定在Car类上实现一个 ID 属性。这样,我的Equals方法只检查 ID 是否相等,然后我的GetHashCode方法返回base.GetHashCode().

这是一个好方法,还是为一个小班实施 GUID 过于严厉?如果没有我上面解释的原因,就不需要它。此 Car 类型唯一性的唯一要求是它在List<T>其所属的集合中是唯一的。但添加 GUID 属性似乎是解决GetHashCode混乱的最快方法。顺便说一句,我的 Car 类型没有 int 属性。

4

2 回答 2

3

如果没有我上面解释的原因,就不需要它。

如果您的班级在逻辑上没有 ID,那么仅仅为了平等而包含它肯定看起来很奇怪。

例如,如果您有两个实例,除了 ID 之外的所有内容都具有相同的属性,那么它们真的不相等吗?如果是,您应该可能只使用Equals/的默认实现,GetHashCode它使用引用标识来实现相等。如果您将使用具有相同 ID 的两个对象,则只需使用对同一对象的两个引用。

这实际上完全取决于上下文,而您并没有给出太多的内容 - 但是为了相等而添加一个 ID有点设计味道。

于 2012-05-28T15:54:30.903 回答
1

而不是实现 Equals 和 GetHashCode 只是使用RemoveAll

myList.RemoveAll(x => x.ID == myCar.ID);

这允许您指定一个谓词来指示应该删除哪些项目(您只删除一个项目并不重要)。


实现EqualsGetHashCode您描述的方式让我觉得非常狡猾-如果您的Equals实现返回true,那么您的GetHashCode方法需要返回相同的值,以便将这两个对象放在哈希表的同一个桶中。您的实现(据我了解)与此标准不匹配,因为基本GetHashCode实现几乎肯定会为两个Car实例返回不同的值,无论它们是否具有相同的 ID。

实施Equals并不GetHashCode完全是微不足道的,如果有替代方案,我通常会避免这样做。如果您真的想这样做,请查看以下资源:

哈希码也不是GUID

于 2012-05-28T16:06:08.693 回答