2011-01-11 5 views
1

딱지. 나는 그 문제를 발견했다. 신경 쓰지 마. 항목이 제거되면 다른 항목으로 대체 될 예정 이었지만 교체가 발생할 수 있기 전에 교체가 발생하지 않았기 때문에 잘못된 항목을 제거한 이벤트가 트리거되었습니다.listBox.Items.Remove가 잘못된 항목을 제거하도록 만들 수있는 원인은 무엇입니까?

두 가지의 주장이 실패 :

var item4 = listBox.Items[4]; 
var item5 = listBox.Items[5]; 

listBox.Items.Remove(item5); 

Debug.Assert(listBox.Items.Contains(item4), "item4 not found"); 
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found"); 

과 :

var item4 = listBox.Items[4]; 
var item5 = listBox.Items[5]; 

listBox.Items.RemoveAt(5); 

Debug.Assert(listBox.Items.Contains(item4), "item4 not found"); 
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found"); 

목록 상자 항목은 사용자 정의 클래스입니다. ListBox는 소유자가 그려집니다.

어설 션 item4 != item5이 전달됩니다.

답변

2

ListBox 항목은 사용자 지정 클래스입니다.

GetHashCode 및 Equals 메서드를 재정 의하여 제거한 경우 항목 4와 항목 5가 실제로 동일하므로 항목 5 대신 항목 4가 제거되므로 항목 5가 먼저 검색되기 때문에 항목 5가 삭제됩니다.

두 번 시도해보십시오. 두 항목이 모두 제거되면 그럴 가능성이 큽니다. item4 == item5 대신 item4.Equals (item5)를 지정해보십시오.

+0

+1 그게 아마도 일어날 것입니다. 그리고'! = '연산자는 아마도 과부하가되지 않을 것이기 때문에 참조 평등을 사용합니다. 이것은 왜 item4! = item5' –

+0

을 전달 하는지를 설명합니다.'item4! = item5'는 이것을 반박하는 것으로 보입니다. 나는 어느 쪽의 방법도 무시했다. 두 메소드를 모두 오버로딩하여 항등 여부를 확인하고 항목의 고유 한 속성을 기반으로 해시 코드를 반환하지만 동작은 변경되지 않습니다. –

+0

이미 두 가지 단언을 시도하고 있었지만 단순화를 위해 질문을하지 않았습니다. 두 단정은 여전히 ​​통과됩니다. 이상하게도, 전의 assertions가 item4.GetHashCode()! = item5.GetHashCode()와 같이 계속 유지 되더라도 Remove (item5)를 다시 호출하여 올바른 item5를 제거 할 수 있습니다. –

관련 문제