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<TKey, TValue> surcharge d'indexeur et de FindEntry


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 10
    Points : 13
    Points
    13
    Par défaut Dictionary<TKey, TValue> surcharge d'indexeur et de FindEntry
    Bonjour,

    Il se trouve que ça optimiserai pas mal mon code si je pouvais créer mon propre indexeur et la fonction FindEntry, pour avoir quelque chose comme :

    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
     
    object IDictionary.this [int key]
    {
    	get
    	{
    		int num = this.FindEntry (key);
    		if (num >= 0)
    		{
    			return this.entries [num].value;					
    		}
     
    		return null;
    	}
     
    	set
    	{
    		Dictionary<TKey, TValue>.VerifyValueType (value);
    		this [key] = (TValue)((object)value);
    	}
    }
     
    private int FindEntry (int key)
    {
    	if (this.buckets != null)
    	{
    		int num = key & 2147483647;
    		for (int i = this.buckets [num % this.buckets.Length]; i >= 0; i = this.entries [i].next)
    		{
    			if (this.entries [i].hashCode == num && this.comparer.Equals (this.entries [i].key, key))
    			{
    				return i;
    			}
    		}
    	}
    	return -1;
    }
    Car j'utilise une struct en Key, mais dans certain cas je voudrais pouvoir directement obtenir une Value en utilisant directement un hashcode.

    La solution de réécrire entièrement une autre classe "CustomDictionary" en copiant l'intégralité de ce que je trouve dans la dll me parait un peu délicate et longue, mais je ne vois pas comment faire d'autre, car j'ai en autre besoin d'accéder à la variable "entries" qui est privée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Dictionary<TKey, TValue>.Entry[] entries;
    Sachant que mes premiers essai me balance pas mal d'erreurs qui on l'air de venir du fait que ma classe ne se trouve pas dans la dll System.

    J'ai peu être raté quelque chose ? Quelqu'un vois une meilleure solutions que de réécrire ma propre classe entièrement ?

    Merci d'avance.

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Et un OrderedDictionnary? tu peux accéder directement avec la clé, un peu comme une liste.
    http://msdn.microsoft.com/en-us/libr...ictionary.aspx
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Malheureusement non, OrderedDictionnary permet d'accéder à un élément par son index, moi j'aimerais plutôt obtenir un élément directement avec son hashcode ce qui n'est pas forcement lié.

    J'ai quand même l'impression que ce que je veux faire n'as pas l'air réellement possible ( en tout cas pas simplement ). Car trop de chose sont en private dans Dictionary<TKey, TValue> et non disponible dans ses interfaces comme IDictionary.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,
    si j'ai bien compris, tu voudrais récupérer des items d'un dico par hashcode directement?

    Mais un hashcode n'identifie pas un objet ! Tout ce qu'un hashcode permet de déduire, c'est hash(a) != hash(b) => a != b.
    Tu ne pourrais faire une fonction de hash injective que si ta struct a une taille inférieure à la taille d'un hashcode, c'est à dire 32 bits. Et si c'est le cas, autant mettre Int32 en clé, et rajouter une méthode à ton dico qui chope une value en prenant le Hashcode d'une Key.
    ಠ_ಠ

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/10/2010, 16h51
  2. Alternative au Dictionnaire<TKey,TValue>
    Par Cartman.inc dans le forum C#
    Réponses: 2
    Dernier message: 14/01/2009, 16h27
  3. Réponses: 5
    Dernier message: 24/04/2003, 11h47
  4. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

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