IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

méthode contains et égalité des objets


Sujet :

C#

  1. #1
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut méthode contains et égalité des objets
    Bonjour,

    J'ai une classe Voiture (immat, marque) et une collection CVoitures.
    j'aurais aimé pouvoir tester l'existence d'une voiture dans la collection (deux voitures sont égales si les imats sont égales et les marques égales).
    J'ai vu plein de choses que je n'arrive pas à implémenter.
    Faut-il faire hériter la classe Voiture de l'interface iequatable et implémenter la méthode equal? j'ai essayé, mais n'accepte pas Class voiture : IEquatable<Voiture>

    où mettre le code testant que deux voitures sont égales si les imats sont égales et les marques égales? Dans Voiture ou dans Cvoiture?
    En espérant m'être fait comprendre..
    Merci pour les réponses
    BR

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 327
    Points
    12 327
    Par défaut
    Ce qui est "Equatable", c'est des voitures donc Voiture.
    Il faut implémenter l'interface IEquatable qui contient une méthode : "Equals"
    http://msdn.microsoft.com/en-us/library/ms131188.aspx

    P.S.: CVoiture, c'est un très mauvais nom pour une collection.

  3. #3
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut
    OK, merci, j'ai pu tout remettre en ordre grace à ton exemple que je n'avais pas vu dans mes recherches.
    Voici ce que j'ai teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
        public class Person : IEquatable<Person>
        {
            private string uniqueSsn;
            private string lName;
            public bool Equals(Person other)
            {
                if (this.uniqueSsn == other.SSN && this.LastName==other.LastName)
                    return true;
                else
                    return false;
            }
    		public override bool Equals(Object obj)
            {
                if (obj == null) return base.Equals(obj);
     
                if (!(obj is Person))
                    throw new InvalidCastException("The 'obj' argument is not a Person object.");
                else
                    return Equals(obj as Person);
            }
     
            //public override int GetHashCode()
            //{
            //    return this.SSN.GetHashCode();
            //}
     
            //public static bool operator ==(Person person1, Person person2)
            //{
            //    return person1.Equals(person2);
            //}
     
            //public static bool operator !=(Person person1, Person person2)
            //{
            //    return (!person1.Equals(person2));
            //}
        }
    J'ai mis la redéfinition des opérateurs en commentaire de sorte que je puisse tester l'égalité des valeurs (Equals) et l'égalité des références (==).
    Si j'utilise une collection de Person (Persons), le contains me renvoie true sur l'égalité des valeurs, ce que je cherchais.
    Une dernière question si je peux abuser...
    Dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            public override bool Equals(Object obj)
            {
                if (obj == null) return base.Equals(obj);
     
                if (!(obj is Person))
                    throw new InvalidCastException("The 'obj' argument is not a Person object.");
                else
                    return Equals(obj as Person);
            }
    à quoi sert le else, je pense qu'on n'y passera jamais puisque la méthode est surchargée par la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            public bool Equals(Person other)
    Merci pour ta collaboration.
    Cordialement
    BR

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 327
    Points
    12 327
    Par défaut
    C'est pour de sombres histoired de covariance ou de contravariance, je sais plus.
    http://msdn.microsoft.com/en-us/libr...7(VS.100).aspx

    C'est "bool Equals(Object obj)" qui est virtuel.

  5. #5
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut
    OK, tout marche nickel, merci, bon WE
    BR

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par r83 Voir le message
    à quoi sert le else, je pense qu'on n'y passera jamais puisque la méthode est surchargée par la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public bool Equals(Person other)
    Citation Envoyé par MSDN
    The IEquatable<T> interface is used by generic collection objects such as Dictionary<TKey, TValue>, List<T>, and LinkedList<T> when testing for equality in such methods as Contains, IndexOf, LastIndexOf, and Remove. It should be implemented for any object that might be stored in a generic collection.
    L'override de Equals(object) est pour quand la méthode Equals est appelée en dehors de ces cas-là.

    Sinon sur un autre sujet, il ne faut pas lancer d'exception à l'intérieur d'une méthode Equals. Retourne false à la place.

    Guidelines for Implementing Equals and the Equality Operator
    Implementing the Equals Method
    IEquatable<T> Interface

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appeler des méthodes qui renvoient des objets
    Par ALeX850 dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2010, 00h49
  2. Méthode JS qui crée des objets dont le nom est recu en paramètre
    Par power of mind dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/07/2009, 13h44
  3. Réponses: 2
    Dernier message: 08/06/2009, 14h46
  4. [PHPTAL] gestion des méthodes des Objets
    Par ronio dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/03/2006, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo