18

我有一本由列表键入的字典:

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 应该是真的。希望我在这里包含了足够的信息......有什么想法吗?

谢谢!

4

4 回答 4

18

List<custom_obj>充当键的实例在引用上不等于 searchObject 引用的实例。

如果您希望字典使用列表中的值而不是引用相等来查找匹配键,则必须在字典的构造函数中提供 IEqualityComparer(因为您不能覆盖 Equals 和 GetHashCode List<T>)。

于 2012-04-04T23:15:01.423 回答
13

您有两个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实施,因为这是一个快速而肮脏的解决方案。

于 2012-04-04T23:15:54.390 回答
3

这仅在查找中使用的实际列表实例与作为键添加的实例相同时才有效。它不会比较列表内容。如果您尝试直接比较两个 List 对象,则会得到相同的行为。

于 2012-04-04T23:15:22.280 回答
0

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

于 2012-04-04T23:16:56.980 回答