我有以下课程:
public class Foo
{
public Guid Id { get; set; }
public string Bar { get; set; }
public DateTime Baz { get; set; }
}
我想像这样在Dictionary中测试它是否相等:
var dict = new Dictionary<Guid, Foo>();
// Add some foos...
if (dict.ContainsValue(myFoo))
{
// Do something...
}
对于Bar和Baz属性等于字典中已有属性的Foos,其中ContainsValue应该返回true。
ContainsValue documentation指出使用默认的EqualityComparer。这表明我可以实现IEquatable接口并重写默认的Equals实现,如下所示:
public override bool Equals(Foo obj)
{
return obj != null &&
Id.Equals(obj.Id) &&
Bar == obj.Bar &&
Baz == obj.Baz;
}
MSDN上的blog post建议在实现IEquatable时,还必须重写Equals(object)和GetHashCode()函数。
但是,如果我要对Equals和GetHashCode函数使用相同的Equality逻辑,则该对象的哈希码将基于可变字段,因此本StackOverflow answer建议不要使用该字段。
因此,我的问题:
在上述情况下,如何为可变对象定义相等逻辑,同时避免将对象的哈希码基于可变值所固有的问题?