2009-11-30 37 views
0

我有我需要包含在內存中的快速訪問轉換表。到目前爲止,我使用了一個簡單的Hashtable Key是內部代碼,Value是一個持有外部代碼和其他元數據的對象。用於雙向轉換數據的.NET容器?

現在我們需要進行反向查找,這意味着要根據外部代碼獲取內部代碼。我只能拿出以下選項:

  1. 有另一個容器用於此查找,哈希表只包含內部代碼作爲值以防止更多的冗餘。
  2. 使用我現在使用的同一個容器,並使用外部代碼作爲密鑰(具有防止衝突的前綴)再次存儲這些對象。
  3. 不要使用Keys獲取數據,而是遍歷包含在同一容器下的值以查找請求的對象(O(n),相同的內存使用情況)。

該容器正在延遲加載,所以選項1 & 2通常不會在最壞的情況下執行。

想到任何人?請告訴我有一些我可以使用的高效容器,我錯過了!

*編輯*

作爲一個GC'd框架,並接受事實我不得不具有兩個轉換陣列(詞典),將實際上意味着予存儲的代碼的以下各行只有一個對象在內存上,然後在兩個不同的散列單元下使用兩個指針?

Dictionary<K1,V> forward; 
Dictionary<K2,V> reverse; 
//...  
void Add(V myObject) 
{ 
    // myObject being the BLL object 
    forward.Add(myObject.InternalCode, myObject); 
    reverse.Add(myObject.ExternalCode, myObject); 
} 

Itamar。

+0

爲什麼你就不能懶加載反向查找散? – Ken 2009-11-30 18:39:32

+0

我是,即使在一個項目的基礎上(而不是一次列表)。這是我的出發點 - 試圖在性能和內存使用方面找到最佳選擇。 – synhershko 2009-11-30 18:54:46

回答

1

構建一個具有兩個內部哈希表(Dictionarys)的自定義集合類,每個方向一個。

public BiHashTable<K, V> 
    { 
    private Dictionary<K, V> vals = new Dictionary<K, V>(); 
    private Dictionary<V, K> keys = new Dictionary<V, K>(); 
    public void Add(K key, V val) 
    { 
     vals.Add(key, val); 
     keys.Add(val, key); 
    } 
    public K this[v val] { get { return keys[val]; } } 
    public V this[K key] { get { return vals[key]; } } 
    // etc... 
    } 

注意:這將是有問題的是K和V都屬於同一類型,則需要再不同配方...

+0

問題中解釋的唯一問題是V不是本機類型。我不想將它用作關鍵...此外,這實際上是最糟糕的情況的實現 - 2個Hashtables作爲一個整體存儲兩次 - 正是我想要避免的... – synhershko 2009-11-30 18:57:32

+0

@synhershko,Why你想避免這種情況嗎?記住,你所存儲的所有內容都是一個參考變量,一個指針。您不存儲兩次對象。我看不出有兩次存儲的東西。如果你不這樣做,你就會陷入對單個集合的迭代中找到給定值的關鍵。而且你並沒有存儲或者「實際使用」這個對象作爲關鍵字,記住,你實際上是使用從這個對象創建的hash作爲關鍵字。 – 2009-11-30 21:41:03

+0

是的,我想這樣 - 看我的編輯。我在問是否有辦法解決兩個哈希表 - 顯然答案是否定的。關於計算非本機類型的哈希值,我知道它是用作密鑰的計算哈希值。然而,我的直覺告訴我,當對象變大時(例如在其中有另一個數組/哈希表),它不會是理想的 - 只是計算哈希將是一項昂貴的任務,至少比實時系統要貴。 – synhershko 2009-12-01 11:50:44

0

我寧願用的Dictionary<TKey, TValue>

兩個實例,這有利於代碼的可讀性

你肯定這本字典是一個性能瓶頸?