Dictionary.ContainsKey行为不端c#

我有一个class级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; } } 

而且我在另一个class级中有以下字段

 Dictionary dictionary 

在执行过程中,我得到了这本dictionary的奇怪行为。 当我输入

 dictionary.ContainsKey(dictionary.Keys.ToList()[1]) 

我弄错了。
地球上怎么样?

更新
我的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); } 

这不是一般问题,而是您的代码特有的问题。

更新:
字典键的哈希码不得更改。 您的Column类不是这种情况,因为只要其任何属性发生更改,哈希代码也会更改。
文件 :

只要对象在Dictionary中用作键,就不能以任何影响其哈希值的方式进行更改。

其背景如下:字典在添加密钥时检索并存储密钥的哈希码。 如果密钥的哈希码在此之后发生了变化,则它与存储的哈希码不同,并且该对象将不会被视为等于最初插入的密钥。

如果Dictionary是正确的,那么我猜它是因为类型ColumnDictionary检查相等性的方式不兼容 – 这是基于通过GetHashCodeEquals比较 – 我的猜测是Column type不实现这些。

将字典的键类型更改为更适合比较和相等的内容。 理想情况下使用从列名称派生的字符串。

更新

基于你的代码更新,我的猜测是关于该列的一些内容已经改变,因为它进入字典导致其“实时”哈希代码从它首次添加到字典时的状态改变 – 所以这可能是任何更改导致其HashCodes更改的IdNameTypeMainColumnChildColumns