首页 > 解决方案 > 应该如何测试可变字典值的相等性?

问题描述

我有以下课程:

public class Foo
{
    public Guid Id { get; set; }
    public string Bar { get; set; }
    public DateTime Baz { get; set; }
}

我想在字典中测试它的相等性,如下所示:

var dict = new Dictionary<Guid, Foo>();
// Add some foos...
if (dict.ContainsValue(myFoo))
{
    // Do something...
}

Where ContainsValue 应该为 Foos 返回 true,其中 Bar 和 Baz 属性等于字典中的一个。

ContainsValue文档声明使用了默认的 EqualityComparer。这表明我可以实现 IEquatable 接口并覆盖默认的 Equals 实现,如下所示:

public override bool Equals(Foo obj)
{
        return obj != null &&
               Id.Equals(obj.Id) &&
               Bar == obj.Bar &&
               Baz == obj.Baz;
}

MSDN 的这篇文建议,在实现 IEquatable 时,还必须重写 Equals(object) 和 GetHashCode() 函数。

但是,如果我对 Equals 和 GetHashCode 函数使用相同的 Equality 逻辑,则对象的哈希码将基于此StackOverflow 答案中建议反对的可变字段。

因此,我的问题是:

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

标签: c#dictionary.net-coreequalsgethashcode

解决方案


推荐阅读