IPathwayModule という不変の値オブジェクトがあり、その値は次のように定義されています。
- (整数) ブロック。
- (エンティティ) モジュール。(文字列) ModuleId で識別されます。
- (列挙) ステータス。と
- (エンティティ) (文字列) ClassId で識別されるクラス - null の場合もあります。
これは、いくつかの単体テストで機能するように見える現在の IEqualityComparer 実装です。しかし、自分が何を正しく行っているかを十分に理解しているとは思えません。以前の実装では、繰り返しテストを実行すると失敗することがありました。
private class StandardPathwayModuleComparer : IEqualityComparer<IPathwayModule>
{
public bool Equals(IPathwayModule x, IPathwayModule y)
{
int hx = GetHashCode(x);
int hy = GetHashCode(y);
return hx == hy;
}
public int GetHashCode(IPathwayModule obj)
{
int h;
if (obj.Class != null)
{
h = obj.Block.GetHashCode() + obj.Module.ModuleId.GetHashCode() + obj.Status.GetHashCode() + obj.Class.ClassId.GetHashCode();
}
else
{
h = obj.Block.GetHashCode() + obj.Module.ModuleId.GetHashCode() + obj.Status.GetHashCode() + "NOCLASS".GetHashCode();
}
return h;
}
}
IPathwayModule は間違いなく不変であり、同じ値を持つ異なるインスタンスは等しく、同じ HashCode を生成する必要があります。それらは HashSet 内の項目として使用されるためです。
私の質問は次のとおりです。
- この場合、インターフェイスを正しく使用していますか?
- 望ましい動作が見られない場合はありますか?
- 堅牢性、パフォーマンスを向上させる方法はありますか?
- 私が守っていない良い習慣はありますか?