2010-03-18 156 views
3

我想知道是否有任何可能的方式使用與實際密鑰相同的密鑰,但使用不同的對象從哈希表中檢索項目。我明白爲什麼它可能是不可能的,但我想看看是否有任何棘手的方法來做到這一點。用哈希表的密鑰克隆從哈希表中檢索值; C#

我的問題來自於這樣一個事實,就像我一樣愚蠢,我創建了帶int []作爲鍵的哈希表,整數數組包含表示空間位置的索引。我不知何故知道每次我想添加一個新條目時都需要創建一個新的int [],但是忽略了當我生成空間座標數組後,他們將無法從我的哈希表中檢索值。

現在我正在嘗試決定是否重新排列一些東西,以便我可以將值存儲在ArrayLists中,或者每次我想要獲取值時是否通過Hashtable中的鍵列表搜索我需要的值,這兩個選項都不是很酷。

當然,除非// 2有辦法讓// 1像// 2一樣工作!

在此先感謝。

static void Main(string[] args) 
     { 
      Hashtable dog = new Hashtable(); 

      //1 
      int[] man = new int[] { 5 }; 
      dog.Add(man, "hello"); 
      int[] cat = new int[] { 5 }; 
      Console.WriteLine(dog.ContainsKey(cat)); //false 


      //2 
      int boy = 5; 
      dog.Add(boy, "wtf"); 
      int kitten = 5; 
      Console.WriteLine(dog.ContainsKey(kitten)); //true; 


     } 
+0

看來你的設計出了問題...... – 2010-03-18 02:32:49

+0

@Hamish Grubijan,你爲什麼這麼說?使用新創建但在其他方面相同的密鑰實例時,在「哈希表」中查找值有什麼問題?這是一種常見的情況,在.NET中得到很好的支持。 – 2010-03-18 02:43:38

+1

@Sam,設計的問題是使用不提供值相等語義的鍵。散列表的一個理想的關​​鍵將1)是不可變的2)覆蓋等於和3)重寫gethashcode。陣列不符合這些標準。 – Josh 2010-03-18 02:52:21

回答

8

是的,你有兩種選擇。

  1. 實現在重點班Equals()GetHashCode()

  2. 創建自定義IEqualityComparer並將其傳遞給Hashtable構造函數。

你想實現Equals()GetHashCode()自己當實現有意義的自定義類的所有用途。如果他們有時只適合,然後使用自定義IEqualityComparer它具有相同的功能,但它提供了它與課程本身分開。第二個選項還允許您爲非自定義鍵類提供自定義規則。

+0

選項2的+1(因爲他不能很好地從'int []'繼承) – 2010-03-18 02:35:45

+0

選項2的另一個+1。雖然我強烈建議更改應用程序的設計以使用更合適的按鍵。 – Josh 2010-03-18 02:50:23