衝突を単純にすることに関するKosi2801のポイントも関連していますが、無意味に一連の文字列を作成するという理由だけでそれを行うことは避けます。(フィールドの性質上、実際には多くの衝突は発生しないと思いますが...)
この回答で以前に使用した「シンプルで簡単に正しくなる」アルゴリズムを使用します(ランスを調べてくれてありがとう:)-そして、あなたが言ったように、効果的なJavaにリストされています。この場合、次のようになります。
public int GetHashCode()
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + StreetAddress.GetHashCode();
hash = hash * 23 + RuralRoute.GetHashCode();
hash = hash * 23 + City.GetHashCode();
hash = hash * 23 + Province.GetHashCode();
hash = hash * 23 + Country.GetHashCode();
hash = hash * 23 + PostalCode.GetHashCode();
return hash;
}
もちろん、それはヌルセーフではありません。C# 3 を使用している場合は、拡張メソッドを検討することをお勧めします。
public static int GetNullSafeHashCode<T>(this T value) where T : class
{
return value == null ? 1 : value.GetHashCode();
}
次に、次を使用できます。
public int GetHashCode()
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + StreetAddress.GetNullSafeHashCode();
hash = hash * 23 + RuralRoute.GetNullSafeHashCode();
hash = hash * 23 + City.GetNullSafeHashCode();
hash = hash * 23 + Province.GetNullSafeHashCode();
hash = hash * 23 + Country.GetNullSafeHashCode();
hash = hash * 23 + PostalCode.GetNullSafeHashCode();
return hash;
}
これをさらに簡単にするために、パラメーター配列メソッド ユーティリティを作成できます。
public static int GetHashCode(params object[] values)
{
int hash = 17;
foreach (object value in values)
{
hash = hash * 23 + value.GetNullSafeHashCode();
}
return hash;
}
そしてそれを呼び出す:
public int GetHashCode()
{
return HashHelpers.GetHashCode(StreetAddress, RuralRoute, City,
Province, Country, PostalCode);
}
ほとんどの型にはプリミティブが含まれているため、多少不必要にボクシングが実行されますが、この場合は参照しかありません。もちろん、不必要に配列を作成することになりますが、時期尚早の最適化について彼らが何を言っているか知っています...