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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top