使用基本类作为字典键类型?

时间:2013-11-29 10:44:06

标签: c# dictionary

有点基本的问题,但这里有......

我经常使用词典存储有关其他对象的辅助信息:

Dictionary<Person, int> timesAccessed;

Person p = // ...;
if (timesAccessed[p] == 0)
    // ...

假设我的'人'类看起来像:

class Person
{
    public string Name;
}

请注意,我尚未在Equals上实施GetHashCodePerson等。字典是否仍然可以使用这样的键快速查找?由于Person是一个类,并且p是引用,我可以想象它使用内存地址/一些内部索引作为哈希代码,但我想确定它不是诉诸对字典的线性扫描。

1 个答案:

答案 0 :(得分:2)

即使检索词典项目也是一种运气,但没有实现Equals或IEqualityComparer。只要您要求完全相同的实例,它就会起作用,但如果您要求使用与字典中的项目相同的数据的新实例,则字典将找不到该项目。
因此,如果您想要字典的确定性行为,则必须在类本身上实现Equals和GetHashCode。作为替代方案,前面提到的IEqualityComparer是一个选项,如果您不能更改用作键的类或者您想要实现不同的比较规则,也可以使用它:

private class PersonEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person p1, Person p2)
    {
        // Compare the strings as needed (culture, casing, nulls, ...)
        return p1.Name == p2.Name;
    }

    public int GetHashCode(Person p)
    {
        // Handle nulls as needed
        return p.Name.GetHashCode();
    }
}

创建字典时,可以在构造函数中提供相等比较器:

var dict = new Dictionary<Person, int>(new PersonEqualityComparer());

该接口还需要为目标类型实现GetHashCode,因此我希望字典能够使用它来有效地查找项目。

相关问题