Visual Studio 2008 (C#)에서 작업 ... List 컬렉션을 사용하여 내 사용자 정의 클래스 (Shift)의 인스턴스를 저장합니다.List <T> .Remove()는 항상 목록의 첫 번째 객체를 삭제합니다.
Remove 메서드를 사용하여 목록에서 특정 시프트를 삭제하려고합니다.
그러나 List.Remove()는 항상 찾은 첫 번째 항목을 삭제합니다.
필자는 Shift 키를 사용하여 IComparable 인터페이스를 구현했지만이 방법으로 충분하다고 생각한 다음 IEqualityComparer 구현을 추가했지만 여전히 효과가 없습니다. 여기
내 구현 발췌입니다 :지역에서 IComparable 회원
public int CompareTo(object obj) { Shift s1 = this; Shift s2 = (Shift)obj; if (s1.start.time != s2.start.time) return s1.start.CompareTo(s2.start); else return s1.end.CompareTo(s2.end); }
endregion
지역 IEqualityComparer 회원
public bool Equals(Shift x, Shift y) { if ((x.opening) != (y.opening)) return false; if ((x.closing) != (y.closing)) return false; if (!x.opening) if (x._start != y._start) return false; if (!x.closing) if (x._end != y._end) return false; if (x.when != y.when) return false; if (x.day != y.day) return false; if (x.EmployeeID != y.EmployeeID) return false; return true; } public int GetHashCode(Shift obj) { return obj.ToString().ToLower().GetHashCode(); }
endregion
아직까지도, 목록에 두 교대가있을 경우 "8:00 - 15:00"; "12:00 - 16:00", 제거 ("12 : 00-16 : 00") 결과는 "8:00 - 15:00"에 제거되고 후자는 콜렉션에 남아 있습니다!
여기에 무슨 문제가 있습니까? 당신은 object.GetHashCode
및 object.Equals
을 무시할 수 있습니다 들으
obj.GetType()! = GetType() 인 경우 false를 반환해야합니다. 그렇지 않으면보다 정교한 알고리즘을 가질 수있는 하위 클래스에 대한 등호 검사를 수행 할 위험이 있습니다. –
-1, 그는 object.GetHashCode()를 오버로드하지 않았으며 IEqualityComparer .GetHashCode (T)를 구현했습니다. –
@csharptest 좋은 지점, 감사합니다 –