2014-03-03 53 views
0

我做類似什麼這裏描述的自定義詞典主要解決方案: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 []?

+1

你重載了'=='嗎?如果沒有,你的'返回(IntPoint)obj == this;'不起作用。 –

+0

什麼是不工作的例子...不工作? –

+0

我只是把這一點加到了帖子 – user2292539

回答

1

如何將IntPoint作爲不可變的值類型實現(如果的確包含不超過幾個字段)並放棄MurableIntPoint?

+0

IntPoint已經是不可變的。有什麼優點成爲一個結構而不是一個對象?我主要關心的是一些2d循環遍歷一個大的2d數組,想要在每個循環迭代中做一些操作。如果每次都必須分配內存,那是不可取的。如果我爲它賦新值,結構會像使用舊c一樣使用相同的內存嗎? – user2292539

+0

Struct是一個對象。無論如何,如果我理解正確 - 你實現了可變類型來節省內存分配,如果這種情況(如果它確實是小型的,並且你不需要繼承)值類型將保存這些分配,而不會產生影響 –

+0

我很抱歉沒有閱讀你的整個評論,但我很高興,我確實瞭解你:-) –