键入字典的自定义相等比较器

时间:2014-09-12 12:47:36

标签: c# dictionary iequalitycomparer

由于Int32 Object,我希望打印" 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 - 任何想法如何正确地写这个?感谢。

1 个答案:

答案 0 :(得分:6)

这对字典来说根本不是一个有效的比较器,结果没有明确定义。平等比较应该是可交换的,特别是a eq b 当且仅当 b eq a时。这不适用于您的情况。同样,有效的哈希代码实现声明:

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

那也失败了。

基本上,这不会起作用。

具体来说,from MSDN

  

对实施者的说明

     

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

     

Equals方法具有反身性,对称性和传递性。也就是说,如果用于将对象与自身进行比较,则返回 true ; true 表示两个对象x和y,如果y和x为 true ;两个对象x和z的 true ,如果x和y为 true ,y和z为 true