【发布时间】:2012-07-13 14:44:27
【问题描述】:
public class Address{
public string ContactName {get; private set;}
public string Company {get; private set;}
//...
public string Zip {get; private set;}
}
我想实现一个不同地址的概念,所以我覆盖了 Equals() 以测试所有字段中不区分大小写的相等性(因为这些是美国地址,我使用 Ordinal 而不是 InvariantCulture 以获得最佳性能) :
public override bool Equals(Object obj){
if (obj == null || this.GetType() != obj.GetType())
return false;
Address o = (Address)obj;
return
(string.Compare(this.ContactName, o.ContactName, StringComparison.OrdinalIgnoreCase) == 0) &&
(string.Compare(this.Company, o.Company, StringComparison.OrdinalIgnoreCase) == 0)
// ...
(string.Compare(this.Zip, o.Zip, StringComparison.OrdinalIgnoreCase) == 0)
}
我想像这样写一个 GetHashCode()(暂时忽略 concatenation inefficiency):
public override int GetHashCode(){
return (this.contactName + this.address1 + this.zip).ToLowerOrdinal().GetHashCode();
}
但这并不存在。我应该改用什么?或者我应该只在我的 Equals() 方法中使用 InvariantCulture?
(我在想.ToLowerInvariant().GetHashCode(),但我不能 100% 确定 InvariantCulture 不能确定相同的字符(例如重音)在另一个上下文中具有不同的含义。)
【问题讨论】:
-
为什么不只是 pverride
Equals(..),因为你已经这样做了?为什么要把GetHashCode(..)和这个混在一起? -
@Tigran 你不需要两个 Equals() 才能正常工作吗? (例如在 LINQ 中)
-
您可以致电特别
Equals(..),然后您就完成了。这是个问题吗? -
@Tigran 我有这些东西的
IEnumerable,想致电Distinct()。 -
看起来是个棘手的问题。这让你的整个想法(无论如何都是一个小/微优化)看起来令人怀疑。