自定义字典键和子类交互

时间:2014-03-03 19:59:59

标签: c# dictionary

我正在做一个类似于此处描述的自定义词典键解决方案:Use custom object as Dictionary Key

但是在我的情况下,密钥可以是层次结构中的2个对象之一。我在遇到这样的事情时得到了未找到密钥的异常:

foreach (IntPointMutable key in tmxMapOffsets.Keys)
{
     newTmxMapOffsets[new IntPoint(key.X - minXValue, key.Y + minYValue)] = tmxMapOffsets[key];
}

我为我的2个类考虑了以下场景:IntPoint和IntPointMutable。它们只是2个整数,X和Y包裹在一个对象中,就像vector2用于浮点数一样。

  • 可以将IntPoint与IntPoint进行比较
  • 可以将IntPoint与IntPointMutable
  • 进行比较
  • 可以将IntPointMutable与IntPoint进行比较
  • 可以将IntPointMutable与IntPointMutable
  • 进行比较

我创建了一个简单的GetHashCode实现,根据我的需要,它将产生所有独特的结果(如果你有大的值,它被授予不会起作用)

public override int GetHashCode()
{
    return x * 10000 + y;
}

然后我在IntPoint中实现了以下内容

public class IntPoint:Object,IEquatable<IntPoint>,IEquatable<IntPointMutable>

public override bool Equals(Object obj)
{
    if (obj == null)
    {
        return false;
    }
    return (obj.GetType() == typeof(IntPoint) || obj.GetType() == typeof(IntPointMutable)) && (IntPoint)obj == this;
}

public bool Equals(IntPointMutable obj)
{
    if (obj == null)
    {
        return false;
    }
    return (IntPoint)obj == this;
}

public bool Equals(IntPoint obj)
{
    if (obj == null)
    {
        return false;
    }
    return obj.GetType() == typeof(IntPoint) && (IntPoint)obj == this;
}

所以看起来我已经覆盖了所有的基础,但它不能进行字典查找,其中涉及每种类型的一个对象。此外,我不喜欢我必须将子类的知识放在其父级中,但我不确定如何允许IntPoint.Equals(someIntPointMutable)情况起作用。

有什么想法吗?

我还覆盖了==运算符,以便比较可以在

之上运行
public static bool operator ==(IntPoint a, IntPoint b)
{
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    if((object)a == null ||(object)b == null)
    {
        return false;
    }

    // Return true if the fields match:
    return a.X == b.X && a.Y == b.Y;
}

各种评论后的一些更新:

显然应该工作正常而不知道超类中的可变版本,就比较检查而言,所以我将删除它。此外,可变的一个被存储到字典中,这是一个禁忌,所以我改变了。理想情况下,我摆脱了可变版本,以避免意外发生这种情况。是使用结构或其他东西来替换它的最佳选择,这是一种简单的方法来传递一对更清晰然后只是int []的整数?

1 个答案:

答案 0 :(得分:1)

如何将IntPoint实现为不可变值类型(如果它实际上只包含几个字段),并丢弃MurableIntPoint?