Pregunta

Trabajar en Visual Studio 2008 (C #) ... Utilizo una colección de listas para almacenar instancias de mi clase personalizada (Shift).

Deseo eliminar un cierto turno de la lista mediante el método Eliminar.

Pero List.Remove () siempre elimina el primer elemento que encuentra.

Implementé la interfaz IComparable para mi Shift, pensé que sería suficiente, luego agregué una implementación de IEqualityComparer y todavía no tiene ningún efecto.

Aquí está el extracto con mi implementación:

  

Miembros IComparables de la región

    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

     

Miembros de la región 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

Y, sin embargo, aún así, cuando la Lista contiene dos turnos, diga "8: 00 - 15: 00"; '' 12: 00 - 16: 00 '', llamando a Eliminar ('' 12: 00-16: 00 '') da como resultado '' 8: 00 - 15: 00 '' siendo eliminado, y este último permanece en la colección!

¿Qué pasa aquí? Thx

¿Fue útil?

Solución

Puede anular object.GetHashCode y 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);
}

También debería hacer una comprobación nula en Equals (x, y) .

Otros consejos

IComparable no se usa normalmente para comparar la igualdad (se usa para ordenar), por lo que List < T > .Remove () lo ignora.

IEqualityComparer no es equivalente a IComparable para fines de igualdad. Se supone que debe ser implementado por un objeto de comparación , es decir, un objeto que compara otros objetos por igualdad. Si desea que las comparaciones de igualdad sean inherentes a su clase, entonces necesita implementar IEquatable < T > . O simplemente anule Object.Equals () y Object.GetHashCode () en su clase, sin implementar ninguna interfaz.

Eliminar utiliza EqualityComparer < T > .Default para determinar la igualdad y elegir qué objeto eliminar, que utilizará IEquatable < T > si está implementado en su objeto, de lo contrario , utilizará la igualdad de referencia.

Tiene dos opciones para obtener el comportamiento que desea:

1) Hacer que Shift implemente IEquatable < T > (no solo anular Object.Equals o hacer el método, sino hacer Shift - Shift: IEquatable < Shift > )

2) Use List < T > .RemoveAt

Con el ejemplo que proporcionó, está llamando:

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

" 12: 00 - 16: 00 " en este caso, es un valor String y no un objeto real Shift . Asegúrese de que, en su método CompareTo , su código esté transfiriendo correctamente el valor String a un objeto Shift . De lo contrario, cuando compara las horas de inicio ... las cosas podrían volverse locas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top