C # - List < T > .Remove () siempre elimina el primer objeto en la lista
-
07-07-2019 - |
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
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.