GetHashCode ()для OrdinalIgnoreCase -зависимые классы строк

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();
}

но этого не существует.Что я должен использовать вместо этого? Или я должен просто использовать InvariantCulture в моем методе Equals ()?

(Я думаю .ToLowerInvariant().GetHashCode(), но я не уверен на 100%, что InvariantCulture не может решить, что идентичный символ (, такой как ударение ), имеет другое значение в другом контексте.)

15
задан Community 23 May 2017 в 10:29
поделиться