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 :

Hashtable.ContainsKey se base sur quoi?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut Hashtable.ContainsKey se base sur quoi?
    Bonjour,

    J'ai une Hashtable dont la clé est une classe perso. Seulement, lorsque je fait MaHashtable.Containskey(), ça me retourne toujours false.

    J'ai pourtant redéfinit la méthode Equals()... J'ai également essayé d'implémenter l'interface IComparable, mais rien...

    Est-ce que quelqu'un peut m'aider? Merci d'avance...

  2. #2
    Membre chevronné
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Par défaut
    Quand tu ajoutes un élément dans ta Hashtable, tu l'ajoutes en définissant une clef. C'est dans ces clefs que ContainsKey() recherche. Es-tu bien sûr de lui fournir une clef valide (et non par exemple l'élément indexé) ?

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Il me semble que la HashTable se base sur la fonction GetHashCode, que tu dois donc surcharger.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Le principe d'une table de hashage c'est de recouvré un élément le plus rapidement possible en fonction d'une clé, peut importe soit t'elle d'ailleurs.

    En réalité le but est de convertir une recherce habituellement en O(n) en O(1), ce qui signifie qu'habituellement une recherche qui parcours toute la liste afin de trouver l'élément va là retourner l'élement en 1 seule (ou 2) opérations de lecture dans la liste...

    La hashtable n'a de réel intérêt qu'au dela de la cinquantaine d'enregistrements, en dessous, un tel mécanisme est une perte de temps.
    Pour pouvoir classer et ordonner les clés, une hashtable utilise des banques, qui selon l'implantation peuvent être un index vers un sous tableau, ou un index dans un tableau principal et dans une table de liaison.
    Ensuite quand tu ajoute un couple clé/valeur, la hashtable calcul (ou demande à l'objet clé) un code de HASHAGE (GetHashCode()) ce code qui est un entier, est l'identifiant de banque. La hashtable va donc aller chercher dans cette banque, la clé. Ensuite il s'agit d'une recherche de type liste chainée normale avec comparaison pour chaque clé (Equals).
    Si l'algorithme du Hashcode permet suffisamment d'enthropie, on peut estimé que la recherche de l'élément sera en temps O(1).
    Plus ton algorithme de hashage (GetHashCode()) retourne des code différents pour des éléments différents, plus tu as de chance minimiser le temps de recherche.

    Si tu te ne redéfini pas le GetHashCode de object, celui-ci est basé et calculé, comportement similaire en java, sur l'adresse mémoire de l'instance... Dans ton cas à moins de rechercher clairement l'instance que tu as utilisée comme clé, tu ne la trouvera jamais dans ta hashtable.

  5. #5
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    Merci de votre aide!

    J'ai effectivement redéfinit la méthode GetHashCode et c'est bon! Merci des explications !

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    N'oublies pas

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

Discussions similaires

  1. [Utilisation] Sur la base de quoi le versionning
    Par berceker united dans le forum Subversion
    Réponses: 44
    Dernier message: 01/01/2014, 15h49
  2. [PC portable] Sur quoi se base-t-on pour acheter un laptop?
    Par sonnyanderson dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 10/09/2013, 15h03
  3. Exploitation de base sur un serveur Web
    Par Oz-WereWolf dans le forum Installation
    Réponses: 10
    Dernier message: 07/03/2004, 22h52
  4. Erreur de connexion à ma base sur serveur Debian - Apache
    Par GLDavid dans le forum Installation
    Réponses: 4
    Dernier message: 24/09/2003, 10h29
  5. [VB6] Zone de liste modifiable basée sur un champ
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/11/2002, 13h41

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