我正在使用Vector3
- 包含属性X
,Y
,Z
作为字典中的键。假设我已经在字典(myDic
)中添加了Vector3
,其值为(0,0,0)。
然后我这样做:
Vector3 vec = new Vector3(0,0,0);
if (!myDic.ContainsKey(vec))
{
//Should never reach here.
}
我还为==
类的!=
和Vector3
创建了重载运算符。
答案 0 :(得分:6)
您需要覆盖班级中的GetHashCode
和Equals
。字典适用于两者的组合,第一个检查是哈希,而密钥是Equals
。为==
提供自定义实现不会对您的字典做任何事情。
如果您不能或不愿意在类本身中覆盖这些方法,那么您的另一个选择是实现IEqualityComparer<YourClass>
并在字典构造函数中提供实现的实例。您将在此实现中提供上述方法的代码。
答案 1 :(得分:4)
你执行错误:)
简而言之,您需要实施Equals
和GetHashCode
:==
和!=
与此无关,因为它们未被使用。
未使用==
和!=
的原因是它们与所有运算符一样,非虚拟和{{1}中K的“约束”是IDictionary<K,V>
(未指定,真的)。因此,只能使用对所有对象(包括object
的所有子类型)有效的(虚拟)方法,例如object
和Equals
这里有多态的时尚。
有关test-case的工作示例,请参阅Example of Dictionary collection with custom class as key?。
快乐的编码。