public class Address{
public string ContactName {get; private set;}
public string Company {get; private set;}
//...
public string Zip {get; private set;}
}
Я хотел бы реализовать понятие distint-адресов, поэтому я переопределял 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();
}
но этого не существует. Что я должен использовать вместо этого? Или я должен просто использовать InvariantCulture в моем методе Equals()?
(Я думаю .ToLowerInvariant().GetHashCode()
, но я не уверен на 100%, что InvariantCulture не может решить, что идентичный символ (например, акцент) имеет другой смысл в другом контексте.)