C # - List <T> .Remove () always removes the first object in the list

Working in Visual Studio 2008 (C #) ... I use the List collection to store instances of my custom class (Shift).

I want to remove a specific shift from the list using the Remove method.

But List.Remove () always removes the first item found.

I implemented the IComparable interface for my Shift, I thought that would be enough, then I added an implementation of IEqualityComparer and still has no effect.

Here is an excerpt with my implementation:

Region IComparable Members

    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

Region Members 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", !

?

+5
4

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).

+11

IComparable ( ), List<T>.Remove() .

IEqualityComparer IComparable . , -, , . , , IEquatable<T>. Object.Equals() Object.GetHashCode() , .

+3

EqualityComparer<T>.Default, , , IEquatable<T>, , .

:

1) Shift IEquatable<T> ( Object.Equals , Shift - Shift : IEquatable<Shift>)

2) List<T>.RemoveAt

0

, , :

List<Shift>.Remove("12:00 - 16:00");

"12:00 - 16:00"in this case is the value String, not the actual object Shift. Make sure that in your method, the CompareTocode you use correctly distinguishes the value Stringto the object Shift. Otherwise, when he compares the start time ... everything could work.

0
source

All Articles