Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将列表作为字典键_C#_List_Dictionary_Containskey - Fatal编程技术网

C#将列表作为字典键

C#将列表作为字典键,c#,list,dictionary,containskey,C#,List,Dictionary,Containskey,我有一本字典,上面有一个列表: private Dictionary<List<custom_obj>, string> Lookup; 根据我的常识,最后一个ContainsKey应该是真的。希望我在这里包含了足够的信息。。。有什么想法吗 谢谢 充当键的列表实例在引用上与searchObject引用的实例不相等 如果希望词典使用列表中的值而不是引用相等来查找匹配的键,则必须在词典的列表中提供IEqualityComparer(因为不能在列表中重写Equals和GetH

我有一本字典,上面有一个列表:

private Dictionary<List<custom_obj>, string> Lookup;
根据我的常识,最后一个ContainsKey应该是真的。希望我在这里包含了足够的信息。。。有什么想法吗

谢谢

充当键的
列表
实例在引用上与searchObject引用的实例不相等


如果希望词典使用列表中的值而不是引用相等来查找匹配的键,则必须在词典的列表中提供IEqualityComparer(因为不能在
列表中重写Equals和GetHashCode).

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

您有两个独立的
List
s,它们包含相同的元素。判断两个列表是否相等的正确方法是使用
SequenceEqual
方法

默认情况下,您无法执行您试图执行的操作。但是,您可以编写一个自定义的
IEqualityComparer
,并将其传递到
字典
构造函数中

下面是一个通用的示例
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;
    }
}
类列表比较器:IEqualityComparer
{
公共布尔等于(列表x、列表y)
{
返回x.x(y);
}
public int GetHashCode(列表对象)
{
int hashcode=0;
foreach(对象中的T)
{
hashcode^=t.GetHashCode();
}
返回哈希码;
}
}

您可能需要改进
GetHashCode
实现,因为这是一个快速而肮脏的解决方案。

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

GetHashCode缺少一个返回值。简要说明:正如答案所提示的,您不应该使用此比较器。equals方法对顺序敏感,但hash方法不敏感。您可以使用
structuralcomparations
class(从.NET 4.0和Visual Studio 2010开始),请参阅。
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;
    }
}