字典中类型的自定义相等比较器

本文关键字:比较器 自定义 类型 字典 | 更新日期: 2023-09-27 18:21:48

由于Int32Object,我希望它打印"True"

    Dictionary<Type, string> dict = new Dictionary<Type, string>(new MyComparer());
    dict[typeof(object)] = "Hello";
    Console.WriteLine(dict.ContainsKey(typeof(int))); // currently prints false :(

这是我试过的比较器:

    public class MyComparer : IEqualityComparer<Type>
    {
        public bool Equals(Type x, Type y)
        {
            return y.IsAssignableFrom(x);
        }
        public int GetHashCode(Type obj)
        {
            return obj.GetHashCode();
        }
    }

但它不起作用。我不太确定在GetHashCode中返回什么-我知道这是错误的,因为在调试时我甚至还没有到达Equals-知道如何正确编写吗?谢谢

字典中类型的自定义相等比较器

对于字典来说,这不是一个有效的比较器,结果也没有定义好。等式比较应该是交换的,特别是a eq b当且仅当b eq a。这不适用于你的情况。同样,一个有效的散列码实现声明:

  • 如果两个散列不相等,则这两个值不相等
  • 两个相等的值必须具有相同的哈希代码

这也失败了。

基本上,这是行不通的。

具体来说,来自MSDN:

实施者注意事项

需要实现以确保如果Equals方法为两个对象x和y返回true,则GetHashCode方法为x返回的值必须等于为y返回的值。

Equals方法是自反的、对称的和传递的。也就是说,如果用于将对象与自身进行比较,则返回truetrue对于两个对象x和y,如果对于y和x是true;如果x和y的true以及y和z的truetrue,则两个对象x和z的truetrue