문제
나는 a에 항목을 추가하고있다 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()
평등 테스트를 위해 재정의 할 필요는 없지만 디버깅에 유용합니다.
다른 팁
Guids와 같은 ListBox의 값에 대한 KEY를 사용할 수 있습니다. 그런 다음 쉽게 사용할 수 있습니다 myListBox.Items.FindByValue(value)
올바른 항목을 찾으려면.
indexof는 참조를 점검하므로 다른 목록의 항목이 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를 반환하기 때문에 작동하지 않습니다 (이것이 현재 메소드가 작동하지 않는 이유입니다). myObject에 대해 정의 할 때 평등을 결정하는 평등 비교를 수행하려면 Y == X를 대체해야합니다. 닐이 제안한대로 신분증을 추가하거나 Neil이 제안한 것처럼 많은 방법 (두 가지 모두에 대한+s)을 재정의하거나, 정확히 동일한 개체로 식별하기 위해 확인할 myObject의 속성을 결정함으로써이를 수행 할 수 있습니다. .