public class Address{
public string ContactName {get; private set;}
public string Company {get; private set;}
//...
public string Zip {get; private set;}
}
個別の住所の概念を実装したいので、Equals() をオーバーライドして、すべてのフィールドで大文字と小文字を区別しない等価性をテストしました (これらは米国の住所であるため、最大のパフォーマンスを得るために InvariantCulture の代わりに Ordinal を使用しました)。
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()
ていますが、InvariantCulture が同じ文字 (アクセントなど) が別のコンテキストでは異なる意味を持つと判断できないとは 100% 確信が持てません。)