C# - LIST .remove () sempre exclui o primeiro objeto na lista
-
07-07-2019 - |
Pergunta
Trabalhando no Visual Studio 2008 (C#) ... Eu uso uma coleção de listas para armazenar instâncias da minha classe personalizada (turno).
Quero excluir uma certa mudança da lista usando o método Remover.
Mas list.remove () sempre exclui o primeiro item que encontra.
Eu implementei a interface iComparável para o meu turno, achei que isso seria suficiente, então adicionei uma implementação do IequalityCompare e ainda não tem efeito.
Aqui está o trecho com minha implementação:
Membros da região
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
Membros da Região IequalityCompare
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
E, no entanto, ainda assim - quando a lista contém dois turnos, diga "8:00 - 15:00"; "12:00 - 16:00", chamando Remover ("12: 00-16: 00") Resultados em "8:00 - 15:00" sendo removidos, e o último permanece na coleção!
O que há de errado aqui? THX
Solução
Você pode substituir object.GetHashCode
e 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);
}
Você provavelmente também deve fazer um check -in nulo Equals(x, y)
.
Outras dicas
IComparable
normalmente não é usado para comparar a igualdade (é usado para pedir), então List<T>.Remove()
ignora.
IEqualityComparer
não é um equivalente a IComparable
Para fins de igualdade. Deve ser implementado por um objeto comparador - isto é, um objeto que compara outros objetos para igualdade. Se você deseja que as comparações de igualdade sejam inerentes à sua classe, então você precisa implementar IEquatable<T>
. Ou apenas substituir Object.Equals()
e Object.GetHashCode()
em sua classe, sem implementar nenhuma interfaces.
Remover usos EqualityComparer<T>.Default
Para determinar a igualdade e escolher qual objeto remover, que usará IEquatable<T>
Se for implementado em seu objeto, caso contrário, ele usará a igualdade de referência.
Você tem duas opções para obter o comportamento que deseja:
1) Torne o implemento de mudança IEquatable<T>
(não apenas substituir o objeto.equals ou fazer o método, mas faça turno - Shift : IEquatable<Shift>
)
2) Use List<T>.RemoveAt
Com o exemplo que você forneceu, você está ligando:
List<Shift>.Remove("12:00 - 16:00");
"12:00 - 16:00"
neste caso, é um String
valor e não um real Shift
objeto. Certifique -se de que em seu CompareTo
Método de que seu código está lançando corretamente o String
valor para a Shift
objeto. Caso contrário, quando compara os horários de início ... as coisas podem dar um maldito.