字典中类型的自定义相等比较器
本文关键字:比较器 自定义 类型 字典 | 更新日期: 2023-09-27 18:21:48
由于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
-知道如何正确编写吗?谢谢
对于字典来说,这不是一个有效的比较器,结果也没有定义好。等式比较应该是交换的,特别是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的true为true。