我正在做一个类似于此处描述的自定义词典键解决方案: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用于浮点数一样。
我创建了一个简单的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 []的整数?
答案 0 :(得分:1)
如何将IntPoint实现为不可变值类型(如果它实际上只包含几个字段),并丢弃MurableIntPoint?