我使用下面的方法将一些StaffRole
文件插入组合框中;
for (int i=0; i < staffRoles.Count; i++)
{
user_Role_Combo.Items.Add(staffRoles[i]);
}
我正在尝试搜索组合框中特定元素的索引,以便在加载时显示正确的元素,我已经得到了这个,但它每次都返回-1;
StaffRole sr = new StaffRole("",roleID);
int comboBoxID = user_Role_Combo.Items.IndexOf(sr);
我这样做的方法不对吗?!
为了在组合框中“找到”新的StaffRole实例,您需要描述为什么两个StaffRole实例应被视为等效。
所以你需要覆盖Equals
和GetHashCode
。从技术上讲,你只需要Equals
,但这两种方法需要一起覆盖。
处理它的一种方法是在roleId
相等上建立对象相等性,如下所示:
public override int GetHashCode() {
return roleId.GetHashCode();
}
public override bool Equals(object obj) {
if (obj == this) return true;
var other = obj as StaffRole;
if (other == null) return false;
return roleId == other.roleId;
}
我这样做的方法不对吗?!
否。默认情况下,IndexOf将检查项目列表中是否存在相同的引用。由于它是您刚刚实例化的新StaffRole,因此它不存在于列表中。
我想你想要做的就是通过ID进行比较。为此,您可以在Equals
类中覆盖GetHashCode
和StaffRole
。在自定义Equals
方法中,您将按角色ID比较两个对象。执行此操作后,IndexOf
将按照您的预期工作,方法是使用ID而不是引用进行比较。
也许你可以使用其中之一
这两种方法都将返回列表中元素的索引,该索引与方法接收的字符串参数的值相匹配。
Combobox documentation here.
我不想替换equal / hashcode方法,因为我需要它们对于不同的实例是不同的。
所以,我使用了一些Linq来找到集合中的正确元素:
this.comboBox_group.SelectedIndex =
this.comboBox_group.Items.IndexOf
(comboBox_group.Items.Cast<Group>().Where(x => x.Id == SelectedId).First());