c# - 목록 .remove ()는 항상 목록에서 첫 번째 객체를 삭제합니다.
-
07-07-2019 - |
문제
Visual Studio 2008 (C#)에서 작업합니다 ... 목록 컬렉션을 사용하여 사용자 정의 클래스 (Shift)의 인스턴스를 저장합니다.
제거 메소드를 사용하여 목록에서 특정 전환을 삭제하고 싶습니다.
그러나 list.remove ()는 항상 찾은 첫 번째 항목을 삭제합니다.
교대를위한 ICompayble 인터페이스를 구현했는데 이것이 충분할 것이라고 생각한 다음 iqualitycomparer의 구현을 추가했지만 여전히 영향을 미치지 않습니다.
내 구현에 대한 발췌문은 다음과 같습니다.
지역을 비교할 수있는 회원
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); }
엔드 영역
지역 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(); }
엔드 영역
그럼에도 불구하고 여전히 - 목록에 두 가지 교대 근무가 포함되어있을 때 "8:00-15:00"이라고 말합니다. "12:00-16:00", remove ( "12 : 00-16 : 00") 호출 "8:00-15:00"이 제거되고 후자는 컬렉션에 남아 있습니다!
여기서 뭐가 잘못 됐어? 고마워
해결책
당신은 무시할 수 있습니다 object.GetHashCode
그리고 object.Equals
:
public override bool Equals(object obj)
{
if(obj == null)
{
return false;
}
return Equals(this, obj as Shift);
}
public override int GetHashCode()
{
return this.GetHashCode(this);
}
아마도 널 체크인을 수행해야합니다 Equals(x, y)
.
다른 팁
IComparable
일반적으로 평등을 비교하는 데 사용되지 않습니다 (주문에 사용됨). List<T>.Remove()
그것을 무시합니다.
IEqualityComparer
동등하지 않습니다 IComparable
평등 목적. a 비교 대상 - 즉, 비교하는 물체입니다 다른 대상 평등을 위해. 평등 비교가 수업에 내재되어 있으려면 오히려 구현해야합니다. IEquatable<T>
. 또는 그냥 무시하십시오 Object.Equals()
그리고 Object.GetHashCode()
인터페이스를 구현하지 않고 수업에서.
용도를 제거하십시오 EqualityComparer<T>.Default
평등을 결정하고 제거 할 물체를 선택하려면 사용합니다. IEquatable<T>
객체에 구현 된 경우, 그렇지 않으면 참조 평등을 사용합니다.
원하는 동작을 얻을 수있는 두 가지 옵션이 있습니다.
1) 시프트 구현을 구현하십시오 IEquatable<T>
(대상을 재정의 할뿐만 아니라 방법을 만들거나 방법을 만드십시오. Shift : IEquatable<Shift>
)
2) 사용 List<T>.RemoveAt
당신이 제공 한 예제와 함께, 당신은 다음을 호출합니다.
List<Shift>.Remove("12:00 - 16:00");
"12:00 - 16:00"
이 경우 a String
실제가 아니라 가치 Shift
물체. 당신의 안에 있는지 확인하십시오 CompareTo
코드가 올바르게 캐스팅되는 방법 String
a에 대한 가치 Shift
물체. 그렇지 않으면, 시작 시간을 비교할 때 ... 일이 건초가 될 수 있습니다.