我有一本字典,它由List:键控
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应该是真的。希望我在这里包含了足够的信息。。。有什么想法吗?
谢谢!
充当键的List<custom_obj>
实例与searchObject引用的实例在引用上不相等。
如果希望字典使用列表中的值而不是引用相等来查找匹配键,则必须在字典的构造函数中提供IEqualityComparer(因为不能重写List<T>
中的Equals和GetHashCode)。
您有两个单独的List
,它们包含相同的元素。找出两个列表是否相等的正确方法是使用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
的实现,因为这是一个快速而肮脏的解决方案。
只有当查找中使用的实际列表实例与作为键添加的实例相同时,这才会起作用。它不会比较列表内容。如果您尝试直接比较两个List对象,则会得到相同的行为。
您确定在查找方法中使用的实例与字典键中的实例相同吗?这是我唯一能想到的事情。