3

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

myListBox.Items.addRange(myObjectArray);

我还想通过以下方式选择我添加的一些项目:

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

然而index总是-1

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

4

3 回答 3

8

您应该确保MyObjectoverrides Equals()GetHashCode()以便ToString()IndexOf()方法可以正确找到对象。

从技术上讲,ToString()相等性测试不需要重写,但它对调试很有用。

于 2009-01-02T23:45:25.760 回答
7

您可以对列表框中的值使用某种键,例如 GUID。然后您可以轻松地使用它myListBox.Items.FindByValue(value)来找到合适的项目。

于 2009-01-02T23:47:11.887 回答
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 定义相等时确定相等。您可以按照 Fallen 的建议添加一个 ID,或者按照 Neil 的建议覆盖一系列方法(两者都为 +s),或者只需确定要检查 MyObject 的哪些属性以将它们识别为完全相同的对象.

于 2009-01-02T23:52:19.567 回答