我使用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");
}
}
}