我认为这可能是一个常见的问题,但是我找不到有关它的任何帖子。
我在下面写一些伪代码。如果要编译代码,请忽略此帖子。
可以说两个类:一个基础类和一个子类。注意:这两个类都具有重写Equals()和GetHashCode()函数,以确保具有相同的属性。
public class A // A has a string property of name
public class B:A // B has a string property of title
var a = new A{name = "bob"};
var b = new B{name = "bob", title = "em"};
某些代码具有基于A的字典
var dict = new Dictionary<A>();
例如做一些添加的东西
dict.Add(a);
但是,如果我使用派生类搜索类型为强制转换的查找函数,则会引发KeyNotFoundException
dict[b];
Dictionary将计算B的哈希码而不是A的哈希码,并据此引发异常。
一个简单而尴尬的解决方案是根据B的属性创建A的新实例。
dict[new A{name = b.name}];
我想知道是否有更好的解决方案?
答案 0 :(得分:0)
您难以用字典的键将对象存储在列表中。如果将对象用作键,则需要提供对同一对象的引用-不仅仅是具有相同属性的对象。
如果您这样做:
dict.Add(new A{name = "bob"}, someData);
然后执行
var result = dict[new A{name = "bob"}];
由于两个新的A
是不同的对象,因此您将获得“找不到密钥”。
答案 1 :(得分:0)
尝试创建一个EqualityComparer,并在字典的构造函数中传递它的一个实例。
class AEqualityComparer : IEqualityComparer<A>
{
public bool Equals(A x, A y)
{
return x.Equals(y);
}
public int GetHashCode(A obj)
{
return obj.GetHashCode();
}
}
var dict = new Dictionary<A, object>(new AEqualityComparer());