문제

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 물체. 그렇지 않으면, 시작 시간을 비교할 때 ... 일이 건초가 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top