0

我有基于自定义类的字典。在继承 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 为空但 Id2 不为空的情况。对于这种情况,我不确定如何覆盖 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, Id2 = null, Id3 = "K3"};

Answer: object1 == object2 because Id3 matches
Example 2

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

Answer: object1 == object2 because Id2 matches
Example 3

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

Answer: object1 == object2 because Id1 matches

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

4

0 回答 0