私は他の答えに同意しません..この例の動物は値オブジェクトではありません.2匹の猫が同じ名前と色を持ち、完全に異なるエンティティであることは完全に実現可能です。論理的には、「この猫とあの猫は同じ名前と同じ色を持っているため、同じ猫です」と言っていますが、これは必ずしも真実ではありません..
Animal.Equals をデフォルトの実装のままにし、動物の名前/色が同じ場合に true を返す別の IEqualityComparer 実装を作成することをお勧めします。
public class AnimalNameColorComparer : IEqualityComparer<Animal>
{
public bool Equals(Animal a, Animal b)
{
return a.Name == b.Name &&
a.Color == b.Color
}
public int GetHashCode(Animal a)
{
return a.Name.GetHashCode() ^ a.Color.GetHashCode();
}
}
猫を比較するにはさまざまな方法があり、1 つの "Equals" メソッドでは不十分であることを覚えておいてください:)
// Create two black cats called fluffy...
var cat1 = new Cat("Fluffy", "Black");
var cat2 = new Cat("Fluffy", "Black");
cat1.Equals(cat2) == false; // they are not the same cat!
var comparer = new AnimalNameColorComparer();
comparer.Equals(cat1, cat2) == true; // But they do have the same name & colour...