c# - 应该如何测试可变字典值的相等性?
问题描述
我有以下课程:
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 答案中建议反对的可变字段。
因此,我的问题是:
在如上所示的情况下,我们应该如何为可变对象定义相等逻辑,同时避免将对象的哈希码基于可变值所固有的问题?
解决方案
推荐阅读
- signalr - 是否可以从 Postman 调用 SignalR Hub
- r - testthat:设置可用于所有测试的数据库连接
- kubernetes - 减少 kubectl scale 的等待时间
- ios - 为什么“volumeAvailableCapacityForImportantUsage”为零?
- python - 使 SymPy 符号仅指实数集
- javascript - 是否有另一种方法可以在此函数之外关闭 MongoDB 连接?
- javascript - 调整窗口大小后转换文本的功能
- codenameone - 如何对拖入自定义组件的结束做出反应
- sql - 如何从字符值中提取数字字符并删除字符值
- sql - 有没有办法在 PostgreSQL 中检查 LEAD() 函数的 NULL 值