字典<key,value> - 键不能是class?</key,value>

时间:2010-12-27 21:00:44

标签: c#

我正在使用Vector3 - 包含属性XYZ作为字典中的键。假设我已经在字典(myDic)中添加了Vector3,其值为(0,0,0)。

然后我这样做:

Vector3 vec = new Vector3(0,0,0);
if (!myDic.ContainsKey(vec))
{
    //Should never reach here.
}

我还为==类的!=Vector3创建了重载运算符。

无论如何它到达那里。使用像Vector3这样的对象作为字典的关键是否有问题?

2 个答案:

答案 0 :(得分:6)

您需要覆盖班级中的GetHashCodeEquals。字典适用于两者的组合,第一个检查是哈希,而密钥是Equals。为==提供自定义实现不会对您的字典做任何事情。

如果您不能或不愿意在类本身中覆盖这些方法,那么您的另一个选择是实现IEqualityComparer<YourClass>并在字典构造函数中提供实现的实例。您将在此实现中提供上述方法的代码。

答案 1 :(得分:4)

你执行错误:)

简而言之,您需要实施EqualsGetHashCode==!=与此无关,因为它们未被使用。

未使用==!=的原因是它们与所有运算符一样,非虚拟和{{1}中K的“约束”是IDictionary<K,V>(未指定,真的)。因此,只能使用对所有对象(包括object的所有子类型)有效的(虚拟)方法,例如objectEquals这里有多态的时尚。

有关test-case的工作示例,请参阅Example of Dictionary collection with custom class as key?

快乐的编码。