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() (暂时忽略连接效率低下):
public override int GetHashCode(){
return (this.contactName + this.address1 + this.zip).ToLowerOrdinal().GetHashCode();
}
但这不存在。我应该改用什么?或者我应该只在我的 Equals() 方法中使用 InvariantCulture 吗?
(我在想.ToLowerInvariant().GetHashCode()
,但我不能 100% 确定 InvariantCulture 不能确定相同的字符(例如重音)在另一个上下文中具有不同的含义。)