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 groupby Values


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 83
    Par défaut Dictionary groupby Values
    Bonjour,

    j'ai un soucis avec le groupement d'un dictionaire.
    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
    class Program
    	{
    		static void Main(string[] args)
    		{
    			Dictionary<int, List<Gilles>> dictionary = new Dictionary<int, List<Gilles>>();
    			dictionary.Add(1, new List<Gilles> { new Person() ,new Addresse()});
    			dictionary.Add(2, new List<Gilles> { new Person() });
    			dictionary.Add(3, new List<Gilles> { new Addresse() });
    			dictionary.Add(4, new List<Gilles> { new Addresse() });
     
    		}
    	}
     
    	public class Person:Gilles
    	{
     
    	}
     
    	public class Addresse:Gilles
    	{
     
    	}
     
    	public class Gilles
    	{
     
    	}
    j'aimerai après groupement obtenir:

    Key Value
    Person 1,2
    Addresse 1,3,4

    Merci d'avance pour toute eventuelle aide ou explication

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    peut-etre en le faisant à la main, du genre:

    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
    private void TEST()
            {
                Dictionary<int, List<Gilles>> dictionary = new Dictionary<int, List<Gilles>>();
                dictionary.Add(1, new List<Gilles> { new Person(), new Addresse() });
                dictionary.Add(2, new List<Gilles> { new Person() });
                dictionary.Add(3, new List<Gilles> { new Addresse() });
                dictionary.Add(4, new List<Gilles> { new Addresse() });
     
                Dictionary<Type, List<int>> types = new Dictionary<Type,List<int>>();
     
                foreach (int key in dictionary.Keys)
                {
                    List<Gilles> gilleList = dictionary[key];
                    foreach (Gilles g in gilleList)
                    {
                        if (types.Keys.Contains(g.GetType()))
                        {
                            types[g.GetType()].Add(key);
                        }
                        else
                        {
                            types.Add(g.GetType(), new List<int>());
                            types[g.GetType()].Add(key);
                        }
                    }
                }
     
                foreach (Type t in types.Keys)
                {
                    Trace.WriteLine("type : " + t.Name);
                    foreach (int v in types[t])
                    {
                        Trace.Write(v + ",");
                    }
                    Trace.WriteLine("");
                }
            }
    Ce n'est peut-être pas la solution la plus élégante mais c'est la seule qui m'est venue à l'esprit !!!

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 83
    Par défaut
    Est il possible de ressoudre le probleme avec la méthode Groupby de linq?

  4. #4
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.

    Ce qui est pénible dans ton cas, c'est que ton dictionnaire contient des listes. Mais c'est faisable via une manip avant le GroupBy :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var groupedElements = dictionary
        .SelectMany(
            dictionaryItem => dictionaryItem.Value,
            (dictionaryItem, listValue) => new {
                Key = dictionaryItem.Key,
                Value = listValue.GetType()
            }
        )
        .GroupBy(item => item.Value, item => item.Key);
    Le SelectMany va te créer un élément temporaire qui contiendra les paires suivantes :

    1 - Person
    1 - Addresse
    2 - Person
    3 - Adresse
    4 - Addresse
    Ensuite on fait un GroupBy sur la valeur et comme ça tu obtiens des paires <Type, liste d'entiers> .

    À toi de voir si ensuite tu veux avoir des string plutôt que des Type sur Person ou Addresse. Pareil, si tu préfères une chaîne « 1, 3, 4 » plutôt qu'une vraie liste, tu peux utiliser Aggregate (par contre, pour utiliser ça faudra auparavant transformer des int en string - typiquement dans le GroupBy).

    P.-S. En français c'est « Adresse » avec un seul 'd', en anglais c'est « Address » avec deux 'd' mais pas de 'e' final : ton « Addresse » est bâtard

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 83
    Par défaut
    Merci

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

Discussions similaires

  1. [WPF]DataGrid Binding Dictionary Key and Value
    Par zenico64 dans le forum C#
    Réponses: 0
    Dernier message: 26/03/2015, 10h41
  2. Calcul du plu court chemin entre 2 sommets d'un graphe valué
    Par atlasm dans le forum Algorithmes et structures de données
    Réponses: 25
    Dernier message: 07/08/2005, 17h06
  3. [MFC]Value Controle dans un comboBox
    Par jul54 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2004, 09h57
  4. Réponses: 4
    Dernier message: 18/11/2003, 16h08
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22

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