使用派生类的C#词典查找

时间:2019-04-01 07:59:04

标签: c# dictionary derived-class

我认为这可能是一个常见的问题,但是我找不到有关它的任何帖子。

我在下面写一些伪代码。如果要编译代码,请忽略此帖子。

可以说两个类:一个基础类和一个子类。注意:这两个类都具有重写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}];

我想知道是否有更好的解决方案?

2 个答案:

答案 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());