2012-04-04 68 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

您确定您在查找方法中使用的实例是字典键中的同一实例吗?这是我能想到的唯一的事情。