有点基本的问题,但这里有......
我经常使用词典存储有关其他对象的辅助信息:
Dictionary<Person, int> timesAccessed;
Person p = // ...;
if (timesAccessed[p] == 0)
// ...
假设我的'人'类看起来像:
class Person
{
public string Name;
}
请注意,我尚未在Equals
上实施GetHashCode
,Person
等。字典是否仍然可以使用这样的键快速查找?由于Person
是一个类,并且p
是引用,我可以想象它使用内存地址/一些内部索引作为哈希代码,但我想确定它不是诉诸对字典的线性扫描。
答案 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,因此我希望字典能够使用它来有效地查找项目。