2011-05-16 83 views
0

有什麼辦法從一個SortedDictionary中檢索一個等於給定對象的鍵?爲了說明這一點,可以說我創建一個具有相當內存爲重,不可變的密鑰類型的字典:獲取一個等於來自SortedDictionary的項目的鍵嗎?

var dictionary = SortedDictionary<MyHugeType, int>(); 
var myEnormousKey = new MyHugeType(); 

dictionary[myEnormousKey] = 123; 

再後來,我做這樣的事情:

// This is a new instance, but it's identical to the previous key 
var myIdenticalKey = new MyHugeType(); 

if(dictionary.ContainsKey(myIdenticalKey)) { 
    myIdenticalKey = dictionary.GetKeyEqualTo(myIdenticalKey); 
} 

// Use myIdenticalKey reference... 

顯然,SortedDictionary不有一個「GetKeyEqualTo」方法。但是有什麼辦法可以達到類似的效果嗎?這基本上會產生內部沉重的關鍵對象的效果,從而可以丟棄相同的實例。我知道我可以通過檢索密鑰的索引以及隨後的匹配對象實例來使用SortedList類來完成此操作,但SortedDictionary的一致插入性能對我的使用會更好。

通過迭代所有字典的鍵來搜索匹配或編寫我自己的BST類,有沒有什麼辦法可以用.NET內置的集合來實現這個目的?

回答

1

您可以將您的值對象從int更改爲包含值和原始鍵的結構或類。然後訪問原始鍵,你可以這樣做:

dictionary[myIdenticalKey].OriginalKey 

和值類似:

dictionary[myIdenticalKey].Value 
+0

現在有一個想法。 :-)我可能會去阻止任何更直接的解決方案。 – nonoitall 2011-05-16 10:27:23

+0

看起來這是我可以做的最好的,而無需重寫類來公開所需的功能。謝謝! – nonoitall 2011-05-16 21:08:33

0

您可以實現在重點班的IEquatable接口。在那裏你指定了兩個類的對象是否相等。之後,您只需使用ContainsKey測試條目的存在,並在返回true時,您可以使用[]運算符獲得該條目。

您也可以提供一個IComparer實現來實現相同的結果。

+0

但SortedDictionary的[]運算符返回與該鍵關聯的_value_。我需要鑰匙本身。 – nonoitall 2011-05-16 10:25:14

+0

關鍵是你目前正在使用的那個,因爲該方法聲明它們是平等的。如果它們相同,則可以像使用上一個關鍵對象一樣使用當前鍵。如果您確實需要原始密鑰,則應該像@aKzenT建議的那樣更改您的實現。 – Osiris76 2011-05-16 10:26:51

+0

但是仍然有兩個(或者在這個應用程序中可能更多)對象實例。我想消除除了其中一個之外的所有引用,類似於string.Intern()方法,只是不使用字符串。 (aKzenT的方法應該可以工作。) – nonoitall 2011-05-16 10:32:42

0

如果覆蓋Equals()GetHashCode()MyHugeType代碼確定兩個實例是否相同,則不會在字典中獲得重複鍵。你是這個意思嗎?

+0

或實施'IEquatable'爲Osiris76說。 – 2011-05-16 10:19:36

相關問題