题
我正在将项目添加到 ListBox
,如下所示:
myListBox.Items.addRange(myObjectArray);
我还想选择以下添加的一些项目:
foreach(MyObject m in otherListOfMyObjects)
{
int index = myListBox.Items.IndexOf(m);
myListBox.SelectedIndices.Add(index);
}
但 index
始终是 -1
。
是否有不同的方法来获取 ListBox
中对象的索引?
解决方案
你应该确保 MyObject
覆盖 Equals()
, GetHashCode()
和 ToString()
所以 IndexOf()
方法可以正确找到对象。
从技术上讲,不需要重写 ToString()
进行相等性测试,但它对于调试很有用。
其他提示
您可以在列表框中使用某种键作为值,例如GUID。然后,您可以轻松使用 myListBox.Items.FindByValue(value)
来查找正确的项目。
IndexOf检查引用,因此如果otherListOfMyObjects中的项不像myListBox.Items那样引用内存中相同的确切对象,则IndexOf将不起作用。
你能做的就是使用linq。这里有一些看起来像C#的伪代码,可以编译并且实际上可以工作:
var items = from x in myListBox.Items where otherListOfMyObjects.Any(y => y == x /*SEE NOTE*/) select x;
foreach(item i in items)
myListBox.SelectedItems.Add(i);
显然,这不起作用,因为y == x将始终返回false(这就是为什么你当前的方法不起作用)。您需要替换y == x来执行相等比较,这将确定您为MyObject定义它时的相等性。您可以通过添加ID作为Fallen建议或通过覆盖Neil建议的方法(对于它们两者都是+)来实现此目的,或者仅通过确定MyObject的哪些属性进行检查以便将它们标识为完全相同的对象
不隶属于 StackOverflow