c# - 自定义类作为 C# 中字典的键不起作用

我最近开始学习 C#,但被困在这个特殊案例上。是的,我已经解决了之前的问题,但无法了解我的代码中的问题所在。 Custom Class used as key in Dictionary but key not found 这是我能找到的最接近的答案,但此处给出的答案似乎对我不起作用。

我有一个字典注册表。 Customers 是一个有 2 个字符串的类:s1 和 s2。客户可以匹配 s1 或 s2(两者都不是必需的)。

类客户:

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 却没有,我不确定为什么。

最佳答案

你在平等设计方面遇到了问题。每个等式对应必须遵循这些规则:

  1. A.Equals(A) == true对于所有 A .
  2. 如果A.Equals(B) == true然后B.Equals(A) == true对于所有 A, B .
  3. 如果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/

相关文章:

sql - SQL Server 中 OVER 和 PARTITION BY 生成的值的状态

java - BitSet 的 set 方法如何处理向左移动的位?

multithreading - 我怎样才能避免这个循环中的 "i"依赖?语言

python - FastAPI 多个路由绑定(bind)到同一个函数。如何知道请求了哪一个

c# - 返回匿名类型的 IEnumerable

bash - awk 或条件

awk - 在 text.file 中切换列

r - 为什么带有 %in% 的条件会忽略缺失值?

python - 通过多级函数传递 kwargs,解包其中一些但传递所有函数

java - Spring Boot-2.1.3 : Parallel Methods Invoca