Dictionary.ContainsKey行为不端c#

时间:2011-06-22 09:15:34

标签: c# .net dictionary

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

2 个答案:

答案 0 :(得分:6)

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

<强>更新
字典键的哈希码不得更改。您的Column类不是这种情况,因为只要其任何属性发生更改,哈希码也会发生变化。
Documentation

  

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

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

答案 1 :(得分:2)

如果Dictionary<Column, string>是正确的,那么我猜是因为类型ColumnDictionary<TKey, TValue>检查相等性的方式不兼容 - 这是基于GetHashCode的比较和Equals - 我的猜测是Column类型没有实现这些。

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

更新

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