3

私は次のListBoxようにアイテムを追加しています:

myListBox.Items.addRange(myObjectArray);

また、次の方法で追加するアイテムのいくつかを選択したいと思います。

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

ただしindex常に-1

オブジェクトのインデックスを取得する別の方法はありますListBoxか?

4

3 に答える 3

8

メソッドがオブジェクトを適切に見つけられるように、オーバーライドMyObjectすることを確認する必要があります。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 に答える