我有一个班级Column
public class Column
{
public int Id { get; private set; }
public string Name { get; private set; }
public EPersonalCharacteristicType Type { get; private set; }
public Column MainColumn { get; private set; }
}
我在另一个班级中有以下字段
Dictionary<Column, string> dictionary
在执行过程中,我得到了这个dictionary
的奇怪行为。当我输入
dictionary.ContainsKey(dictionary.Keys.ToList()[1])
我得到了false
地球上怎么样?
已更新
我的Column
类有GetHashCode或Equals Functions。以下是它们的实现:
public bool Equals(Column other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return other.Id == Id && Equals(other.Name, Name) && Equals(other.Type, Type) && Equals(other.MainColumn, MainColumn) && Equals(other.childColumns, childColumns);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Column)) return false;
return Equals((Column) obj);
}
public override int GetHashCode()
{
unchecked
{
int result = Id;
result = (result*397) ^ (Name != null ? Name.GetHashCode() : 0);
result = (result*397) ^ Type.GetHashCode();
result = (result*397) ^ (MainColumn != null ? MainColumn.GetHashCode() : 0);
result = (result*397) ^ (childColumns != null ? childColumns.GetHashCode() : 0);
return result;
}
}
public static bool operator ==(Column left, Column right)
{
return Equals(left, right);
}
public static bool operator !=(Column left, Column right)
{
return !Equals(left, right);
}
答案 0 :(得分:6)
这不是一般问题,而是您的代码特有的。
<强>更新强>
字典键的哈希码不得更改。您的Column
类不是这种情况,因为只要其任何属性发生更改,哈希码也会发生变化。
Documentation:
只要对象在Dictionary中用作键,就不能以任何影响其哈希值的方式进行更改。
背景如下: 字典在添加密钥时检索并存储密钥的哈希码。如果密钥的哈希码在此之后发生了变化,则它与存储的哈希码不同,并且该对象不会被视为等于最初插入的密钥。
答案 1 :(得分:2)
如果Dictionary<Column, string>
是正确的,那么我猜是因为类型Column
与Dictionary<TKey, TValue>
检查相等性的方式不兼容 - 这是基于GetHashCode
的比较和Equals
- 我的猜测是Column
类型没有实现这些。
将字典的键类型更改为更适合比较和相等的内容。理想情况下使用从列名称派生的字符串。
基于你的代码更新,我的猜测是关于该列的一些内容已经改变,因为它进入字典导致其“实时”哈希代码从它首次添加到字典时的状态改变 - 所以可能是导致其Hash代码发生变化的Id
,Name
,Type
,MainColumn
或ChildColumns
中的任何更改。