2010-09-27 57 views
4

是否有任何.NET類型代表一組鍵值對,其中每個鍵只會與單個值配對(如常規Dictionary),但每個值只會與一個鍵配對?我一直認爲這是一個「可反轉」的字典,因爲你可以交換鍵值與沒有任何碰撞。編寫這樣的類不應該很難,並且爲給定的值添加諸如「TryGetKey」之類的方法。然而,我想檢查一下這樣的事情是否已經存在,或許是用我沒有想到的另一個名字。.NET「可逆」字典,其中的鍵和值是可交換的

另外,考慮到對this question的優雅回答,我可以創建一個類來表示這個可逆字典,當我可以輕鬆地使用LINQ將任何字典轉換爲其值對應的字典時,這是否值得?

回答

3

我不相信在框架中有一個類可以直接做到這一點。

此外,考慮到優雅的回答這個問題,這將是值得我去創建一個類來表示這種可逆的字典,當我可以很容易地使用LINQ到任何字典轉換到它的價值,等效鍵?

這兩個問題的答案都取決於你將如何訪問你的數據。如果您需要基於關鍵和價值的快速,持續的時間訪問,您很可能想要創建自己的集合。

雖然這可以做得非常非常容易。只需在你的類中包裝兩個Dictionary實例,並且當你添加一個新元素時,添加到兩個 - 一個具有鍵/值,另一個具有值/鍵。您的查找例程可以從相應的集合中提取,並且訪問時間將保持在O(1)附近。

但是,如果內存更受關注,那麼您可以使用單個集合,然後使用LINQ來解析它。這會讓你的「反向」查找速度變慢,因爲你需要每次重新解析。

+0

那麼,對於引用類型來說,有額外字典的內存開銷不會太大,不是嗎? – cwap 2010-09-27 18:24:40

+0

@cwap:如果鍵和值都是引用類型,則字典開銷(至少在64位計算機上)每個條目爲24個字節。 – 2010-09-27 18:26:56

+0

遇到一個錯誤,我在嘗試編寫一個既實現了'IDictionary '和'IDictionary '的類時也沒有見過:''InvertibleDictionary '無法實現'System.Collections。 Generic.IDictionary '和'System.Collections.Generic.IDictionary ',因爲它們可以統一某些類型參數替換「。猜猜我會實現一個! – 2010-09-27 18:57:32

1

如果您確實需要這樣的數據結構,那麼您可能不希望每次執行查找時轉換它的開銷。也就是說,如果您有正常的Dictionary<string,int>,那麼每次您按價值查找時,都必須經過該轉換。您可以對其進行優化,以便只在字典發生變化時才進行轉換(即添加,刪除或更改了某個項目),但支付的價格仍然相當高。