我做類似什麼這裏描述的自定義詞典主要解決方案:Use custom object as Dictionary KeyСustom字典鍵和子相互作用
但是在我的情況下,密鑰可以在層2級的對象之一。
foreach (IntPointMutable key in tmxMapOffsets.Keys)
{
newTmxMapOffsets[new IntPoint(key.X - minXValue, key.Y + minYValue)] = tmxMapOffsets[key];
}
我認爲在以下情況下我2類:IntPoint和IntPointMutable perfomring事端這樣當我拿到鑰匙未發現異常。它們只是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 []?
你重載了'=='嗎?如果沒有,你的'返回(IntPoint)obj == this;'不起作用。 –
什麼是不工作的例子...不工作? –
我只是把這一點加到了帖子 – user2292539