質問
次のように 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に対して定義する等値を決定する必要があります。これを行うには、Fallenが提案したようにIDを追加するか、Neilが提案したようにメソッドのバットロードをオーバーライドします(両方の+を使用)。 。