C#HashSet中具有相同哈希码的多个对象?

时间:2015-03-05 17:03:26

标签: c# hashset

我使用Syncfusion网格控件的选择来获取我们的数据对象列表。当我们多选对象时,由于某种原因,对象被双重报告。下面的代码返回一个选项的一个条目,两个选定对象的四个(!),三个的六个(!)等。

选择代码中似乎存在一个小错误,导致在this.BaseGridControl.Model.Selections中报告两次多选。是的,应该修复bug。但就目前而言,我可以解决这个问题;由于这些行所代表的对象无论如何都要进入HashSet,因此应该对它们进行重复数据删除。

HashSet<Bean> selectedBeanSet = new HashSet<Bean>();

for (int i = this.BaseGridControl.Model.Selections.Count - 1; i >= 0; i--) {
    selection = this.BaseGridControl.Model.Selections.Ranges[i];
    topRow = selection.Top;
    bottomRow = selection.Bottom;
    for (int j = bottomRow; j >= topRow; j--) {
        selectedBeanSet.Add(GetObjectAtRow(j));
    }
}

但即使这样做,我仍然有四行,而应该只有两行。在即时窗口中进行询问,我可以了解一下那里有什么:

selectedBeanSet.Take(4).ToList()[3].GetHashCode()
5177447
selectedBeanSet.Take(4).ToList()[1].GetHashCode()
5177447

这些仍然是同一个对象!我自己写了.GetHashCode() - 我知道它指的是Bean的属性而不是任何类型的引用。

如果有任何疑问:

selectedBeanSet.GetType().Name
"HashSet`1"

同一个对象如何在HashSet两次? .GetHashCode()我在即时窗口中的呼叫不是HashSet中用作密钥的那个吗?这里发生了什么?

编辑:这是我的.GetHashCode()实施。我在这里放了一个断点,然后走了进去,所以我知道它已经被击中了。

public override int GetHashCode() {
    return this.Property1.GetHashCode() ^ this.Property2.GetHashCode() ^ this.Property3.GetHashCode();
}

.Equals()

public override bool Equals(Bean other) {
    return this.Property1 == other.Property1 && this.Property2 == other.Property2 && this.Property3 == other.Property3;
}

编辑2 Bean课程,为公众消费而进行消毒。这有点奇怪,因为出于持久性原因,我们将所有内容存储在幕后的struct中。不过,我认为这个问题无关紧要。

public class Bean : AbstractBean<Bean, BeanStruct> {
    BeanStruct myStruct;

    public int Property1 {
        get {
            return this.myStruct.property1;
        }
        set {
            this.myStruct.property1 = value;
            RaisePropertyChanged("Property1");
        }
    }
    public string Property2 {
        get {
            return this.myStruct.property2;
        }
        set {
            this.myStruct.property2 = EngineUtils.FillOrTruncate(value, Bean.Length);
            RaisePropertyChanged("Property2");
        }
    }
    public string Property3 {
        get {
            return this.myStruct.property3;
        }
        set {
            this.myStruct.property3 = EngineUtils.FillOrTruncate(value, Bean.Length);
            RaisePropertyChanged("Property3");
        }
    }
}

0 个答案:

没有答案