3

キーがXYZオブジェクトで、値がである辞書がありますboolean。XYZ クラスは Autodesks API からのものであるため、私が作成したクラスではありません。キーが辞書に存在するかどうかを確認しようとしています。

私の問題:辞書にキーが含まれているnew XYZ(1,1,1)場合、辞書にこのキーが含まれているかどうかを確認するために、myDictionary.ContainsKey(new XYZ(1,1,1)常にfalseを返します。

なぜこれが起こっているのですか?どうすれば修正できますか? XYZクラスにはそのメソッドを実装する必要があると思いますが、Equals前に述べたように、このクラスを Autodesks API の一部として作成しませんでした。それとも私は何か間違ったことをしていますか?

Dictionary<XYZ, bool> prevPnts = new Dictionary<XYZ, bool>();
prevPnts[new XYZ(1,1,1)] = true;

// Always says the pnt doesnt exist?
if (prevPnts.ContainsKey(new XYZ(1,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> prevPnts = new Dictionary<XYZ, bool>(new XYZEqualityComparer());
4

3 に答える 3