使用随机缺失的属性覆盖 GetHashCode

问题描述

我有基于自定义类的字典。我在继承 IEquatable 接口时面临覆盖 GetHashCode() 的问题。我的类对象具有三个属性

  1. Id1(字符串)
  2. Id2(字符串)
  3. Id3(字符串)

我正在从两个不同的来源检索数据,并根据上述自定义类从这些集合中创建字典。在某些情况下,一个数据源填充了上述 id 中的两个,而另一个数据源只填充了一个 id。例如,

Collection1 = {Object{Id1 = null,Id2 = "NewId2",Id3 = "NewId3"}}

Collection2 = {Object{Id1 = null,Id2 = null,Id3 = "NewId3"}}

也有在collection2中Id3为null但Id2不为null的情况。对于这种情况,我不确定如何覆盖 GetHashCode()。我已经尝试过 if-elseif-else 块,但在某些边缘情况下此逻辑会失败:

if (Id3 != null)
{
   return Id3.GetHashCode();
}
else if (Id2 != null) {
   return Id2.GetHashCode();
}
else {
   return Id1.GetHashCode();
}

在我的情况下似乎没有特定的顺序。对于更多上下文,我尝试使用 .NET 字典中的 TryGetValue 方法。我查看了源代码,发现他们在那里使用 GetHashCode() 来按键搜索,这就是我通过错误跟踪到此函数的方式。有人知道解决这个问题的方法吗?

编辑:添加一些示例以阐明正确的行为

Example 1

Object1 = Object1{Id1 = null,Id2 = "K2",Id3 = "K3"};
Object2 = Object2{Id1 = null,Id3 = "K3"};

Answer: object1 == object2 because Id3 matches
Example 2

Object1 = Object1{Id1 = null,Id3 = null};

Answer: object1 == object2 because Id2 matches
Example 3

Object1 = Object1{Id1 = "K1",Id3 = "K3"};
Object2 = Object2{Id1 = "K1",Id3 = null};

Answer: object1 == object2 because Id1 matches

Edit2:当两个对象之间的 id 至少相等时,就会发生匹配。 为便于讨论,假设以下哈希码映射,

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)