2014-04-15 81 views
0

我正在使用自定義類作爲字典(TKey,TValue)的關鍵字。該類重寫GetHashCode和Equals等。有沒有辦法使用等效鍵檢索Dictionary鍵?

我希望能夠做的是添加一個鍵/值對;之後,生成一個等於第一個密鑰的新密鑰(相同的哈希碼,Equals返回true),並且使用此等效密鑰不僅可以檢索該值,而且還可以檢索對第一個已添加的原始密鑰的引用到詞典。

例子:

var keyA = new KeyClass("abc123"); 
var keyB = new KeyClass("abc123"); // same as far as dictionary is concerned 

var dict = new Dictionary<KeyClass, Object>(); 

dict.Add(keyA, value); 

現在我怎樣才能使用KEYB從字典到科亞參考?

這似乎應該很容易做到沒有枚舉Keys集合,因爲Dictionary已經將這些鍵哈希化了,但是我找不到任何構建到Dictionary類中的東西。我錯過了什麼嗎?現在,我將不得不使用雙向字典並進行反向查找,或者(在本例中爲我的首選項)「增強」我用於值的類,以便它們存儲對原始鍵的引用。

+1

當「類重寫的GetHashCode和平等相待,等」 - 怎麼可能出問題? ;) –

+0

我不確定你想要達到什麼目的?爲什麼列舉鍵是不夠的? –

+0

@MitchWheat在類中實現'IEquatable'時,需要重寫這些方法。 http://msdn.microsoft.com/en-us/library/ms131190(v=vs.110).aspx – Smeegs

回答

1

嘛,@ AD.Net是恰當的答案其中大部分是真正覆蓋GetHashCode()Equals()

public class KeyClass 
{ 

    public readonly string key; 

    public KeyClass(string key) 
    { 
     this.key = key; 
    } 

    public override bool Equals(object other) 
    { 
     if (other == null) 
     return false; 

     // Casting object other to type KeyClass 
     KeyClass obj = other as KeyClass; 
     if (obj == null) 
     return false; 

     return this.key == other.key; 
    } 

    public override int GetHashCode() 
    { 
     return this.key.GetHashCode(); 
    } 
} 
+0

如果'other'不能轉換爲'KeyClass',那麼不會拋出異常嗎?也許'KeyClass obj = other作爲KeyClass;'在這裏更合適。 (當然,之後檢查'null'是必須的)。 – Corak

+0

@Corak是的,我儘可能快地回答,非常抱歉。如果'KeyClass obj =(KeyClass)obj'會引發'InvalidCastException',我知道 –

+0

我不確定你在這裏告訴我什麼 - 我沒有試圖設計KeyClass,我試圖獲取最初添加到字典中的KeyClass實例的引用。 – Rich

相關問題