加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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?以获得更好的替代品.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读