我最近开始学习 C#,但被困在这个特殊案例上。是的,我已经解决了之前的问题,但无法了解我的代码中的问题所在。 Custom Class used as key in Dictionary but key not found 这是我能找到的最接近的答案,但此处给出的答案似乎对我不起作用。
我有一个字典注册表
类客户:
public class Customers
{
public string _s1;
public string _s2;
public Customers(string s1, string s2)
{
_s1 = s1;
_s2 = s2;
}
public class EqualityComparer : IEqualityComparer<Customers>
{
public bool Equals(Customers x, Customers y)
{
Console.WriteLine("Inside Equals");
return ((x._s1.Equals(y._s1)) || (x._s2.Equals(y._s2)));
}
public int GetHashCode(Customers x)
{
return x._s1.GetHashCode() ^ x._s2.GetHashCode();
}
}
}
程序.cs:
Dictionary<Customers, string> registry = new Dictionary<Customers, string>(new Customers.EqualityComparer());
Customers key = new Customers("1", "2");
Customers key2 = new Customers("12", "21");
registry.Add(key, "12");
registry.Add(key2, "22");
Customers lookUp1 = new Customers("1", "2");
Customers lookUp2 = new Customers("1", "32");
if (registry.ContainsKey(lookUp2))
{
Console.WriteLine("Found");
}
else
{
Console.WriteLine("Not Found");
}
问题是,当 s1 和 s2 都匹配时,我得到“找到”,但是当只有其中一个得到“未找到”时,尽管相应地更改了 Equals() 并给出了新的 EqualityComparer 的引用也在构造函数中。
此外,对于 lookup1,我确实得到了“Inside Equals”,但对于 lookup2 却没有,我不确定为什么。
最佳答案
你在平等设计方面遇到了问题。每个等式对应必须遵循这些规则:
A.Equals(A) == true
对于所有 A
.A.Equals(B) == true
然后B.Equals(A) == true
对于所有 A, B
.A.Equals(B) && B.Equals(C) == true
然后A.Equals(C) == true
对于所有 A, B, C
.正如我们所见,规则 #3(传递规则)已损坏:
Customer A = new Customer("x", "y");
Customer B = new Customer("x", "z");
Customer C = new Customer("p", "z");
由于相等不正确实现,Dictionary<K, V>
无法正常工作。
https://stackoverflow.com/questions/72690403/