可变字典值应如何进行相等性测试?

时间:2019-01-22 16:13:11

标签: c# dictionary .net-core equals gethashcode

我有以下课程:

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建议不要使用该字段。

因此,我的问题:

在上述情况下,如何为可变对象定义相等逻辑,同时避免将对象的哈希码基于可变值所固有的问题?

0 个答案:

没有答案