C # - La liste < T > .Remove () supprime toujours le premier objet de la liste.
-
07-07-2019 - |
Question
Travailler dans Visual Studio 2008 (C #) ... J'utilise une collection List pour stocker des instances de ma classe personnalisée (Shift).
Je souhaite supprimer un certain décalage de la liste à l'aide de la méthode Remove.
Mais List.Remove () supprime toujours le premier élément trouvé.
J'ai implémenté l'interface IComparable pour mon Shift, j'ai pensé que cela suffirait, puis j'ai ajouté une implémentation de IEqualityComparer, qui n'a toujours aucun effet.
Voici l'extrait de ma mise en œuvre:
Membres IComparables de la région
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); }
région d'extrémité
région IEqualityComparer Members
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(); }
région d'extrémité
Et pourtant, quand même - quand la liste contient deux décalages, dites "8: 00-15: 00"; "12: 00-16: 00", appelant Supprimer ("12: 00-16: 00") résulte en "8: 00 - 15: 00" être retiré, et le dernier reste dans la collection!
Qu'est-ce qui ne va pas ici? Thx
La solution
Vous pouvez remplacer object.GetHashCode
et 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);
}
Vous devriez également probablement effectuer une vérification nulle dans est égal à (x, y)
.
Autres conseils
IComparable
n'est normalement pas utilisé pour comparer (il est utilisé pour le classement), donc Liste < T > .Remove ()
l'ignore.
IEqualityComparer
n'est pas un équivalent de IComparable
à des fins d'égalité. Il est supposé être implémenté par un objet comparateur , c’est-à-dire un objet qui compare d’autres objets à l’égalité. Si vous souhaitez que les comparaisons d'égalité soient inhérentes à votre classe, vous devez alors implémenter IEquatable < T >
. Ou simplement substituer Object.Equals ()
et Object.GetHashCode ()
sur votre classe, sans implémenter d'interfaces.
Remove utilise EqualityComparer < T > .Default
pour déterminer l'égalité et choisir quel objet à supprimer, qui utilisera IEquatable & l> T >
si elle est implémentée sur votre objet, sinon , il utilisera l’égalité de référence.
Vous avez deux options pour obtenir le comportement souhaité:
1) Assurez-vous que Shift implémente IEquatable < T >
(remplacez pas uniquement Object.Equals ou créez la méthode, mais définissez Shift - Shift: IEquatable < Shift >
)
2) Utilisez Liste < T > .RemoveAt
Avec l'exemple que vous avez fourni, vous appelez:
List<Shift>.Remove("12:00 - 16:00");
Dans ce cas, "12: 00 - 16: 00"
est une valeur String
et non un objet Shift
. Assurez-vous que votre code dans la méthode CompareTo
transforme correctement la valeur String
en un objet Shift
. Sinon, quand on compare les heures de départ ... les choses pourraient mal tourner.