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 :

Dictionary TryGetValue ou !Contains


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Dictionary TryGetValue ou !Contains
    Bonjour

    Une petite question academique pour ceux qui ont déja été reniflé le code

    Pour acceder a une valeur d'un dictionnaire, je me demande s'il est plus performant de faire un TryGetValue ou bien une Sequence de ContainsKey et d'assignation le cas échéant ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Si c'est pour accéder à la valeur, TryGetValue me semble plus adapté, vu qu'il effectue la recherche et la récupération en 1 passe. Si tu fais via un Contains suivi de la récupération via index, tu feras 2 passes, ce qui est moins intéressant. A benchmarker pour valider !

  3. #3
    Membre éprouvé Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Par défaut Un peu de code pour illustrer
    Declaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    System.Collections.Generic.Dictionary<int, String> monDictionnaire = new Dictionary<int, string>();
    monDictionnaire.Add(0, "zero");
    monDictionnaire.Add(1, "un");
    monDictionnaire.Add(2, "deux");
    Methode 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string valeurRecherchee1String;
    if (monDictionnaire.ContainsKey(1))
        {
        valeurRecherchee1String = monDictionnaire[1];
        // Code ici...
        }
    Methode 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string valeurRecherchee2String;
    if (monDictionnaire.TryGetValue(1, out valeurRecherchee2String))
        {
        // Code ici...
        }
    Je pense comme "Arnard" mais j'utilise toujours l'autre methode (la premiere ici)

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Tout dépend le type de la clé et le volume également... mais la logique commande le trygetvalue (moche avec le out mais bon on se refait pas )

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonjour Le Cygne

    Merci pour cette illustration mais ca ne réponds pas a la question !
    Le probleme n'est pas de savoir comment coder l'une ou l'autre des methode mais bien de savoir si TryGetValue fait beaucoup gagner en performance

    Pour etre honnete, moi aussi j'avais l'habitude d'utiliser un test sur Contains et c'est par hazard que je suis tombé sur ce TryGetValue

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par Arnard
    (moche avec le out mais bon on se refait pas )
    De fait !
    Mais quand je suis passé du C au C# mon habitude des pointeurs me faisaient un peu abuser des ref et des out
    Je suis guéri mais ca ne me fait pas peur

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Logiquement tryGetValue te fait gagner du temps.

    Si on expose en code :

    TryGetValue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //A key = keyToSearch;
    B value = null;
    foreach(KeyValuePair<A,B> paire in monDico)
    {
       if(paire.key == keyToSearch)
       {
          value = paire.Value;
          break;
       }
    }
    Contains
    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
    //A key = keyToSearch;
    B value = null;
    bool found = false;
     
    foreach(KeyValuePair<A,B> paire in monDico)
    {
       if(paire.key == keyToSearch)
       {
          found = true;
          break;
       }
    }
    //Plus loin
    if(found)
      value = monDico[keyToSearch];//Qui introduit un nouveau parcours du graphe de données
    J'ai fait le choix du foreach pour que ça reste clair, mais Dictionnary est une classe plus complexe qui gère les clés à sa manière. cela montre que le premier parcours ne traite qu'une fois la collection, et la 2e méthode introduit 2 parcours

  8. #8
    Membre éprouvé Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Par défaut
    Citation Envoyé par olibara Voir le message
    Bonjour Le Cygne

    Merci pour cette illustration mais ca ne réponds pas a la question !
    Le probleme n'est pas de savoir comment coder l'une ou l'autre des methode mais bien de savoir si TryGetValue fait beaucoup gagner en performance

    Pour etre honnete, moi aussi j'avais l'habitude d'utiliser un test sur Contains et c'est par hazard que je suis tombé sur ce TryGetValue
    Je suis d'accord avec toi, et je ne connais pas la réponse, Désolé de t'avoir décu. Mais au cas ou quelqu'un qui ne connais pas les dictionnaires passerait par là, il pourra suivre le fil de la discussion et si elle est apportée, comprendre la réponse.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Par défaut
    Le plus simple est encore d'aller voir le code de Dictionnary<,> !

    ContainsKey fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public bool ContainsKey(TKey key)
    {
        return (this.FindEntry(key) >= 0);
    }
    TryGetValue fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public bool TryGetValue(TKey key, out TValue value)
    {
        int index = this.FindEntry(key);
        if (index >= 0)
        {
            value = this.entries[index].value;
            return true;
        }
        value = default(TValue);
        return false;
    }
    A partir de là, on en déduis simplement que les deux méthodes reviennent très exactement au même

    Ps: pour ceux qui ne connaissent pas, j'ai tout simplement utiliser Reflector (qui est maintenant devenu payant dans la version 7), dès que j'ai un doute sur ce que fait .NET, je vais voir par moi même. On apprend parfois beaucoup de chose avec ça !

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Darkherumor

    Citation Envoyé par Darkherumor
    A partir de là, on en déduis simplement que les deux méthodes reviennent très exactement au même
    Ah non justement mais tu as quand meme répondu a la question
    Car si le ContainsKey donne true if faudra reacceder la valeur et il est vraissemblable que FindEntry soit relancé

    Donc ContainsKey n'est intéressant que pour un test d'existence mais sinon c'est TryGetValue qu'il faut utiliser !

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

Discussions similaires

  1. Utilisation Dictionary
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 18/10/2004, 15h51
  2. Ajout d'un Component dans un Container
    Par willowII dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 07/09/2004, 18h08
  3. [LDAP] recherche dans differents container LDAP avec Java
    Par touinth dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 01/07/2004, 16h06
  4. [GEF]class Figure dans container SWING ?
    Par Albarad dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/06/2004, 12h12
  5. [Turbo C++] Fonciton containing for are not expanded inline
    Par BuG dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 17/02/2003, 06h48

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