使用派生类进行C#字典查找

问题描述 投票:-2回答:2

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

我在下面写一些伪代码。如果你想编译代码,请忽略这篇文章。

所以说两个类:一个基类和一个子类。注意:两个类都具有重写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);

但是,如果我使用/ o类型转换搜索派生类,则查找函数将引发KeyNotFoundException

dict[b];

字典将计算B的哈希码而不是A,并根据它提出异常。

一个简单而尴尬的解决方案是根据B的属性创建一个新的A实例。

dict[new A{name = b.name}];

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

c# dictionary derived-class
2个回答
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());

0
投票

使用字典的键将列表中的对象存储起来很困惑。如果使用对象作为键,则需要提供对同一对象的引用 - 而不仅仅是具有相同属性的对象。

如果你这样做:

dict.Add(new A{name = "bob"}, someData);

然后这样做

var result = dict[new A{name = "bob"}];

你会得到'找不到钥匙',因为这两个新的As是不同的对象。

© www.soinside.com 2019 - 2024. All rights reserved.