在接口GetHashCode
方法的文档中的“实现者注释”部分中,它指出:IEqualityComparer<T>
实现需要确保如果 Equals 方法为两个对象 x 和 y 返回 true,则 GetHashCode 方法为 x 返回的值必须等于为 y 返回的值。
众所周知T
,如果两个项目相等,您为什么希望两个实例返回相同的哈希码;它们不同意味着它们不相等,而它们相同则意味着它们可能相等。
当两个实例不相等时,我将返回值的引号解释为未定义(即使它们的值可能表明如此)。
以以下为例。我有一个序列int?
,我想将其用于统计分类,其中每个非空值int?
代表一个类的一个属性(想想枚举值)。在这些值为空的情况下,您不希望将这些值视为相等,因为它们会使训练集偏向于缺失值。如果有的话,在这种情况下,与其他空值相比,您希望空值返回 false。
问题是,在该GetHashCode
方法中,当给定 null 时,我可能想要返回 0 (或其他一些数字,也许Int32.MinValue
)。现在,我知道当使用此IEqualityComparer<T>
实现键入任何内容时,检查字典中是否存在键的性能对于这些情况不会是最佳的。
也就是说GetHashCode
,当调用Equals
返回 false 时,返回一个已知与其他值冲突的值是否有效?我倾向于是的,因为上面的引用在这件事上是未定义的。