c# – 字典表示密钥不存在时
发布时间:2020-12-16 00:10:22 所属栏目:百科 来源:网络整理
导读:我有一个字典,其中键是XYZ对象,值是布尔值. XYZ类来自Autodesks API,因此它不是我制作的类.我试图检查字典中是否存在密钥. 我的问题:如果字典包含新的XYZ(1,1,1)键,我将使用myDictionary.ContainsKey检查字典是否包含此键(新的XYZ(1,1)始终返回false. 为什
我有一个字典,其中键是XYZ对象,值是布尔值. XYZ类来自Autodesks API,因此它不是我制作的类.我试图检查字典中是否存在密钥.
我的问题:如果字典包含新的XYZ(1,1,1)键,我将使用myDictionary.ContainsKey检查字典是否包含此键(新的XYZ(1,1)始终返回false. 为什么会发生这种情况?我该如何解决这个问题?我认为类XYZ需要实现它的Equals方法,但正如我之前提到的,我没有创建这个类,它是Autodesks API的一部分.或者我做错了什么? Dictionary<XYZ,bool> prevPnts = new Dictionary<XYZ,bool>(); prevPnts[new XYZ(1,1)] = true; // Always says the pnt doesnt exist? if (prevPnts.ContainsKey(new XYZ(1,1))) TaskDialog.Show("Contains"); else TaskDialog.Show("NOT Contains"); 解决方案使用Konrads的答案 class XYZEqualityComparer : IEqualityComparer<XYZ> { public bool Equals(XYZ a,XYZ b) { if (Math.Abs(a.DistanceTo(b)) <= 0.05) return true; return false; } public int GetHashCode(XYZ x) { int hash = 17; hash = hash * 23 + x.X.GetHashCode(); hash = hash * 23 + x.Y.GetHashCode(); hash = hash * 23 + x.Z.GetHashCode(); return hash; } } Dictionary<XYZ,bool>(new XYZEqualityComparer()); 解决方法
将自己的IEqualityComparer提供给字典,因为它不知道如何比较XYZ类(严格来说,它通过引用比较它们):
class XYZEqualityComparer : IEqualityComparer<XYZ> { public bool Equals(XYZ a,XYZ b) { return a.X == b.X && a.Y == b.Y && a.Z == b.Z; } public int GetHashCode(XYZ x) { int hash = x.X ^ x.Y ^ x.Z; return hash .GetHashCode(); } } 然后: Dictionary<XYZ,bool>(new XYZEqualityComparer()); 注意:我的GetHashCode实现只是示例.阅读What is the best algorithm for an overridden System.Object.GetHashCode?以获得更好的替代品. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |