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 :

[C#] A la recherche d'une collection


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut [C#] A la recherche d'une collection
    Bonjour,

    je recherche une collection qui me permettent de stocker des objets et de pouvoir faire dans certains cas la recherche d'un objet à partir de la valeur d'une chaîne de caractères qui est une propriété de l'objet lui-même.

    Vous allez me proposer KeyedCollection.

    La particularité est que cette propriété peut-être vide. Et je ne suis pas sûr que KeyedCollection convienne.

    Merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Bonjour,

    Que la propriété peut être vide ne cause pas de probleme pour utiliser KeyedCollection. Le probleme se pose si plusieur objets doivent être insérés dans la collection avec la propriété vide, dans se cas aucun dictionnaire ne le permettera parce que les clés ne doivent pas être dupliquées.

  3. #3
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    justement, pour mon cas, la propriété vide est utilisée plusieurs fois.
    Donc côté dictionnaire, il n'y a pas de solution.
    Et côté ICollection ?
    Il y a la méthode contain qui permet de savoir si la référence d'un objet existe déjà. N'y a-t-il pas moyen de vérifier si un objet appartient à une collection selon les valeurs de certaines propriétés ?

    Merci d'avance.

  4. #4
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Tout est possible, pour cela il suffit d'heriter de la structure que tu juge la plus adéquate à ton probleme. Ensuite tu definis ta propre méthode Contains. Par contre la recherche sera en O(n) contrairement aux dictionnaires.

    Exemple :

    Code C# : 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
     
     public class MyCollection:List<MyClass>  
    {
     
            public bool Contains(string value)
            {
                bool found = false;
                for (int i = 0; i < this.Count; i++)
                {
                    if (this[i].Prop== value)
                    {
                        found = true;
                        break;
                    }
                }
                return found;
            }
     
    }

  5. #5
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonsoir,

    il n'y aurait pas aussi l'implémentation de l'interface IEquatable ?
    J'avais lu ça sur la MSDN.
    Mais je vais étudier ta proposition.

    Petite question con, il est possible de dériver une méthode qui n'est pas déclarer comme virtuelle ?
    Le seul souci est que le polymorphisme ne peut s'appliquer ? C'est cela ?
    Bon c'est vrai que le polymorphisme n'a aucun interêt dans ce cas précis, mais c'est juste pour l'explication.

    Merci bien.

  6. #6
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Citation Envoyé par Pilloutou
    J'avais lu ça sur la MSDN.
    Qu'est-ce que tu as lu exactement ? IEquatable permet de definir une méthode equals pour ta classe. Je ne vois pas l'utilité dans ton cas

  7. #7
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonsoir,

    dans la description de la classe List<>, il est précisé ceci:

    Les méthodes telles que Contains, IndexOf, LastIndexOf et Remove utilisent un comparateur d'égalité pour les éléments de liste. Le comparateur d'égalité par défaut pour le type T est déterminé comme suit. Si le type T implémente l'interface générique IEquatable, le comparateur d'égalité est la méthode Equals de cette interface ; sinon, le comparateur d'égalité par défaut est Object.Equals(Object).
    Je pensais donc utiliser IEquatable, mais il est vrai aussi que votre solution est assez interessante.

  8. #8
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Citation Envoyé par Pilloutou
    N'y a-t-il pas moyen de vérifier si un objet appartient à une collection selon les valeurs de certaines propriétés ?
    Cette contrainte change completement le comportement par défaut de Contains. Contains permet de vérifier qu'n objet avec les mêmes propriété existe déja dans la collection, dans ce cas il faut que la classe implémente IEquatable. Dans ton cas utilise la méthode que je t'ai donné

  9. #9
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Merci bien pour tout.

    Et dernière question, à propos de ma question con:

    Petite question con, il est possible de dériver une méthode qui n'est pas déclarer comme virtuelle ?
    Le seul souci est que le polymorphisme ne peut s'appliquer ? C'est cela ?
    Bon c'est vrai que le polymorphisme n'a aucun interêt dans ce cas précis, mais c'est juste pour l'explication.
    Qu'en dites-vous ?

  10. #10
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Primo, c'est possible de redéfinir les méthodes qui ne sont pas marquées virtuelles. Dans ca cas ca s'appelle du Hiding c'est à dire que tu cache la méthode de la classe dont tu hérite, le polymorphisme n'est pas biensure appliquable.

    Secundo, tu ne peux utiliser override qu'avec une méthode marquée virtuelle, override ou abstract.

    Tertio Polymorphisme == Virtual depuis que C++ existe (même avant peut être).

    Polymorphisme (guide de programmation C#)

  11. #11
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Ok merci bien, j'avais un doute parce qu'il n'y a pas en Java, (j'en ai fais un peu), de mot-clé similaire au virtual.

    Merci bien

  12. #12
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    oui pas de virtual en java, tout est polymorphe par défaut, souvenirs souvenirs .

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

Discussions similaires

  1. [1.x] Faire une recherche dans une collection..
    Par nims dans le forum Symfony
    Réponses: 6
    Dernier message: 17/03/2010, 09h15
  2. Affiné recherche sur une collection de controle
    Par Lapinpanda dans le forum ASP.NET
    Réponses: 0
    Dernier message: 19/08/2009, 16h40
  3. Réponses: 2
    Dernier message: 19/05/2008, 21h48
  4. A la recherche d'une collection de vidéos
    Par amalirou dans le forum Vidéo
    Réponses: 0
    Dernier message: 13/11/2007, 07h08
  5. Recherche d'une collection de complexité O(1)
    Par Pilloutou dans le forum Framework .NET
    Réponses: 1
    Dernier message: 16/03/2007, 10h37

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