2012-04-04 93 views
12

我有一個由列表鍵的字典:C#列表作爲字典鍵

private Dictionary<List<custom_obj>, string> Lookup; 

我試圖使用的containsKey,但它似乎並沒有工作,我不知道爲什麼。 這裏是我的Visual Studio即時窗口調試信息:

?Lookup.Keys.ElementAt(7)[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
?Lookup.Keys.ElementAt(7)[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
searchObject[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
searchObject[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
?Lookup.ContainsKey(searchObject) 
false 

在我的常識,那最後的containsKey應該是真實的。希望我在這裏包含了足夠的信息......任何想法?

謝謝!

回答

14

充當鍵的List<custom_obj>實例與引用searchObject的實例不相等。

如果你想在字典中使用的列表,而不是參考平等的價值找到匹配的密鑰,則必須在字典中的constructor提供一個的IEqualityComparer(因爲你不能重載Equals和GetHashCode在List<T>)。

3

這隻有在查找中使用的實際列表實例與添加爲鍵的實例相同時纔有效。它不會比較列表內容。如果您嘗試直接比較兩個List對象,則會出現相同的行爲。

8

您有兩個單獨的List s包含相同的元素。找出兩個列表是否相同的正確方法是使用SequenceEqual方法。

你不能默認做你想做的事情。但是,您可以編寫自定義IEqualityComparer並將其傳遞給Dictionary構造函數。

下面是一個簡單通用的IEqualityComparer

class ListComparer<T> : IEqualityComparer<List<T>> 
{ 
    public bool Equals(List<T> x, List<T> y) 
    { 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(List<T> obj) 
    { 
     int hashcode = 0; 
     foreach (T t in obj) 
     { 
      hashcode ^= t.GetHashCode(); 
     } 
     return hashcode; 
    } 
} 

您可能希望提高對GetHashCode實現,因爲這是一個快速和骯髒的解決方案。

+0

GetHashCode缺少返回。 – 2014-12-16 18:45:46

+0

快速提示:正如答案所暗示的,您不應該使用此比較器。 equals方法對順序很敏感,但是散列方法不是。 – 2016-06-16 19:35:25

0

您確定您在查找方法中使用的實例是字典鍵中的同一實例嗎?這是我能想到的唯一的事情。