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

Framework .NET Discussion :

Dictionnaire à 2 clef


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut Dictionnaire à 2 clef
    Et oui je reviens avec mes idées bizarres

    J'aimerai savoir si il existe une implémentation d'un dictionnaire à 2 clef.
    en gros on ferait dict.Get("clef1", "clef2") et dict.Set("clef1","clef2", value)

    En gros le but serai d'avoir la représentation d'un tableau ou chaque colone serai associé a une des premières clef (dans mon cas une date) et chaque ligne associé une des deuxièmes clef (un objet business) et donc chaque cellule contient une valeur correspondant avec une des premières et une des deuxièmes clef (un peu comme des coordonnées)

    Comment représenter cela efficacement ? (et pas de datatable non typé hein ! )

    Merci

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par anthyme Voir le message
    Et oui je reviens avec mes idées bizarres

    J'aimerai savoir si il existe une implémentation d'un dictionnaire à 2 clef.
    en gros on ferait dict.Get("clef1", "clef2") et dict.Set("clef1","clef2", value)

    En gros le but serai d'avoir la représentation d'un tableau ou chaque colone serai associé a une des premières clef (dans mon cas une date) et chaque ligne associé une des deuxièmes clef (un objet business) et donc chaque cellule contient une valeur correspondant avec une des premières et une des deuxièmes clef (un peu comme des coordonnées)

    Comment représenter cela efficacement ? (et pas de datatable non typé hein ! )

    Merci
    Deux solutions : Soit tu écrit ta classe de gestion de grille (type excel) soit tu utilises un Dictionnary<int, Dictionnary<int, object>>

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Mouarf !

    Bon je vais réfléchir la dessus mais bon mes collègues me poussent a faire une datatable ... moi qui espérait sortir une solution de mon chapeau magique

    Merci pour les idées !

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Tiens, moi j'utilise ça; ca prends moins de temps qu'une table, c'est plus léger;

    J'arrive en moyenne à faire du 100*1000000.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    public class CompositeKeyDictionary<T,U,V> 
        {
            private Dictionary<T, Dictionary<U, V>> _grid;
     
            public CompositeKeyDictionary()
            {
                _grid = new Dictionary<T, Dictionary<U, V>>();
     
            }
     
            public IEnumerable<V> GetThirdLevel(T k1)
            {
                if (_grid.ContainsKey(k1))
                {
                    return _grid[k1].Values;
                }
                return null;
            }
     
            public IDictionary<U,V> GetRecords(T k1)
            {
                if (_grid.ContainsKey(k1))
                {
                    return _grid[k1];
                }
                return null;
            }
     
            public void ClearRecords(T k1)
            {
                if (_grid.ContainsKey(k1))
                {
                    _grid[k1].Clear();
                }
            }
     
            public void AddRecord(T k1,U k2,V k3)
            {
                Dictionary<U, V> kvp;
                if (_grid.ContainsKey(k1))
                {
                    kvp = _grid[k1];
                    kvp.Add(k2, k3);
     
                }
                else
                {
                    kvp = new Dictionary<U, V>();
                    kvp.Add(k2, k3);
                    _grid.Add(k1, kvp);
     
                }
     
            }
     
            public void RemoveRecord(T k1)
            {
                _grid.Remove(k1);
            }
     
            public void Clear()
            {
                _grid.Clear();
            }
     
     
     
        }

  5. #5
    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
    Si tu n'as besoin que des cellules et jamais des lignes / colonnes, un dico simple suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dictionary<Pair<string, string>, T>
    Où Pair est une struct toute bête à deux valeurs (le fx 3.5 a probablement ça quelque part), qui doit même pas avoir besoin de surcharger IEquatable parce qu'il me semble déjà que deux structs sont égales si tous ses champs sont égaux.

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Non, c'est un peu lourd à faire en fait si tu veux une structure relationnelle.

    En fait tu es obligé de créer tes propres critéres de comparaison.

    Au début j'avais utilisé un objet<T,U> qui recevait deux params et constitue la clef, mais au bout d'un moment, si tu encapsules ça dans un objet, tu vas arriver au moment où tu vas faire un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    var _busobject=(BusinessObject)ObjectFactory.GetBusinessObject(25);
    var _assertion=new CompositeKey<DateTime,BusinessObject>(DateTime.Parse("01/01/2008"),_busobject);
    
    if (_dic.contains(_assertion))
    {
    ...
    }
    Et là, tu es obligé de spécifier une modalité de comparaison de la clef pour un couple donné.

    J'avais à l'époque utilisé le moteur d'évaluation de spring et une instanciation par string[] des propriétés à contrôler, mais là, ça devient beaucoup trop lours à traiter en fait.

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/05/2014, 12h23
  2. Réponses: 18
    Dernier message: 04/11/2011, 10h24
  3. Réponses: 27
    Dernier message: 06/04/2010, 17h23
  4. Réponses: 2
    Dernier message: 13/10/2006, 23h35
  5. INSERT avec procédure stockée / Clef de type AutoInc
    Par bgdelphi dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/10/2003, 18h30

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