如何在ListBox中获取项目的索引?

3

我正在像这样向 ListBox 添加项目:

myListBox.Items.addRange(myObjectArray);

我还希望能够通过以下方式选择我添加的一些项目:

foreach(MyObject m in otherListOfMyObjects) 
{
    int index = myListBox.Items.IndexOf(m);
    myListBox.SelectedIndices.Add(index);
}

然而,index 总是 -1

有没有一种不同的方法来获取 ListBox 中对象的索引?


所以你想要加载一个包含100个项目的列表,并选择其中20个项目? - jrcs3
3个回答

8
你应该确保MyObject重写了Equals()GetHashCode()ToString()方法,这样IndexOf()方法才能正确找到对象。
从技术上讲,为了进行相等性测试,ToString()没有必要被重写,但是它对于调试很有用。

1
谢谢!我忘记重写equals和hashcode方法了...真丢人。 - jjnguy
它起作用了吗?下面有人说IndexOf检查引用,这意味着我的解决方案不会起作用。 - Neil Barnwell
解决方案已经修复了。我只是覆盖了equals方法,就像魔术一样它就被修复了。 - jjnguy
好的 - 请注意建议总是一起实现GetHashCode和Equals,以防对象在哈希映射中使用。 - Neil Barnwell

7

您可以使用一种键来表示列表框中的值,如GUID。然后,您可以轻松使用myListBox.Items.FindByValue(value)找到正确的项目。


0

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建议的那样+ s)来实现此目的,或者只需确定要检查哪些MyObject属性以识别它们为完全相同的对象。


2
但是 Linq 太酷了,天哪,哈哈 - user1228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接