今天在使用C#中的泛型集合Dictionary<TKey,TValue>時,發現它的ContainsKey()竟然不能使用我自訂的Key類別所覆寫的Equals()函式。這點著實令我感到不可思議。 ContainsKey()這個函式我已經使用很久了,可這還是第一次發現ContainsKey()傳回來的結果,令我訝異。 我想要的很簡單,就是我有一個資料型別,而我另外定義一個跟這個資料型別相互配合的Key類別。我想要將相同Key值的資料群組起來。於是我宣告了以下這樣的Dictionary<>: Dictionary<TKey,TValue> dic = new Dictionary<Tkey, TValue>(); 接著我就依續為每筆資料產生它對應的Key物件,將它放到這個Dictionary中。當然我的Key類別有覆寫了Equals()函式,而且我用ContainsKey()函式來判斷是否有相同Key的資料存在這個Dictionary中。可是當程式執行完後,發現沒有一筆資料的Key是相同的。我確認過資料,應該是會有Key是相同的才對。此時的我開始感覺不妙。難道Dictionary不再是我所認識的那個Dictionary了嗎!! 於是我開始查詢網路上相關的資料,有人提到在 MSDN中有相關的說明 。看了之後才恍然大悟,原來是這麼一回事啊。 IEqualityComparer 首先來看一段程式碼,這是我一開始以為可以正確地讓Dictionary<>.ContainsKey()為我找到相同Key值的寫法: class MyKey { public int ID; } static void Test1() { Dictionary dicTest = new Dictionary(); MyKey key1 = new MyKey(); key1.ID = 10; dicTest.Add(key1, "Test"); MyKey key2 = new MyKey(...