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 :

Regroupement d'objet c#


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut Regroupement d'objet c#
    Bonjour
    j'ai un petit souci que je n'arrive pas à résoudre.

    Voila j'ai un objet :
    Magasin
    avec des proprietes dont une qui s'appelle Type et qui une chaine de caractere

    J'ai un tableau de Magasin avec par exemple si je liste les valeurs Type pour chaque element de mon tableau le résultat suivant :

    Carrefour
    Geant
    Atac
    Geant
    Geant
    Auchan
    Auchan
    Carrefour


    J'aimerai avoir une liste de Magasin triée en fontion des valeurs de Type afin de donner la liste suivante si j'exploitai la proprieté type

    Atac
    Auchan
    Auchan
    Carrefour
    Carrefour
    Geant
    Geant
    Geant

    ex :
    listeMagasin[0].Type -> afficherai 'Atac' et non 'Carrefour' comme actuellement

    En fait je ne sais pas si c'est faisable d'avoir une liste consistante triée en fonction de la valeur d'une proprieté.


    Un grand merci pour votre aide,
    Bien Cordialement,

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Tu travailles avec quelle version de Visual Studio (2005, 2008) ? C# (2.0, 3.5) ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par Jérôme Lambert Voir le message
    Tu travailles avec quelle version de Visual Studio (2005, 2008) ? C# (2.0, 3.5) ?
    Oui désolé j'ai complètement zappé de préciser ça !

    vs 2005 et c# 2.0

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Les tableaux ont une méthode Sort et lorsque tu utilises des objets complexes (comme ton objet Magasin), la méthode Sort peut prendre en paramètre un IComparer (ou IComparer<T> pour la version générique). Tu dois donc créer une classe qui implémente l'interface IComparer (je te conseille de passer par la version générique).

    En gros, ça te donnera un truc du genre pour ta classe comparer :

    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
    public class monComparerPourMagasin : IComparer<Magasin>
    {
     
        #region IComparer<Process> Members
     
        public int Compare(Magasin x, Magasin y)
        {
            if (x.Param1 < y.Param1)
                return -1;
            else if (x.Param1 > y.Param1)
                return 1;
            else
                0;
        }
     
        #endregion
    }
    Et lorsque tu voudras trier, tu n'auras qu'à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tonArray.Sort(new monComparerPourMagasin());
    Si tu veux des renseignements sur l'interface IComparer, voici les liens vers MSDN :

    http://msdn.microsoft.com/fr-fr/library/system.collections.icomparer(VS.80).aspx
    http://msdn.microsoft.com/fr-fr/library/8ehhxeaf(VS.80).aspx

    En cas de problème, n'hésite pas.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Super merci ça fonctionne parfaitement !

    pour info le code que j'ai utilisé est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public int Compare(Magasin x, Magasin y)
            {
                Magasin magasinA = (Magasin)x;
                Magasin magasinB = (Magasin)y;
                return String.Compare(magasinA.Type, magasinB.Type);
            }

    Le souci que je rencontre apres c tri est un regroupement par element. Je m'explique.

    Mon objet Magasin dispose d'une proprieté Region.

    Je dois représenter les choses comme ceci :


    Nord
    -Carrefour
    -Geant
    -Geant

    Sud
    -Atac
    -Atac
    -Carrefour

    Est
    -Carrefour
    -Carrefour
    -Geant

    le souci que je rencontre c'est que je n'arrive pas à faire ce genre de répartition

    En parcourant simplement la liste comme elle est aujourd'hui j'obtiens ceci :

    Nord
    -Carrefour
    Nord
    -Geant
    Nord
    -Geant

    Sud
    -Atac
    Sud
    -Atac
    Sud
    -Carrefour

    Est
    -Carrefour
    Est
    -Carrefour
    Est
    -Geant



    Quelqu'un aurait il une idée pour réaliser ce genre de répartition ?

    Par avance merci pour votre aide,
    Bien Cordialement,

  6. #6
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Tes données sont elles issues d'une base de données ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    oui mais elle me sont restituées via un WebService qui me retourne les objets définis plus haut

    je n'ai pas la main en fait sur l'organisation des données à la sortie de la base

  8. #8
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    bon bas essaye peut être ça


    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
    public int Compare(Magasin x, Magasin y)
            {
                Magasin magasinA = (Magasin)x;
                Magasin magasinB = (Magasin)y;
     
     
    int RegionComparison = string.Compare(magasinA.Region, magasinB.Region);
    if(RegionComparison == 0)
    {
        return String.Compare(magasinA.Type, magasinB.Type);
    }
     
    return RegionComparison;
     
     
            }

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    En fait la structure que j’avais commencé à construire était celle-ci

    Ligne
    Region

    Region
    TitreRegion
    List<Magasin>

    Magasin
    Type
    Place



    Dans mon objet Region, mettre le titre de la region et dans la liste des magasins, mettre les magasins présents dans cette region
    Pour savoir dans quelle region le magasin appartient on a la propriete Place qui nous le renseigne

  10. #10
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Je comprend pas...

    Si le tri précédent fonctionne, tu peux te débrouiller pour avoir un affichage comme tu cites... En parcourant tes éléments un à un non ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par oyigit Voir le message
    Je comprend pas...

    Si le tri précédent fonctionne, tu peux te débrouiller pour avoir un affichage comme tu cites... En parcourant tes éléments un à un non ?
    En fait le truc qui m'échappe c'est le regroupement par Region

    foreach(Magasin m in listMagasins)
    {
    //ici il faudra creer une sorte de filtre afin d'inscrire qu'une seule fois la région
    }

  12. #12
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Utilise un dictionnaire, en utilisant la clé comme libellé de la région et comme valeur la liste des magasins de la région.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dictionary<string, List<Magasin>> regions;
    Après pour l'utilisation, en admettant que la région soit indiqué au niveau du magasin (avec une propriété Region de type string renvoyant le libellé de la région pour l'exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach(Magasin m in listMagasins)
    {   
        if (!regions.Contains(m.Region))
        {
            regions[m.Region] = new List<Magasin>();
        }  
        regions[m.Region].Add(m);
    }
    Tu auras ainsi une entrée par région dans le dictionnaire et pour chaque entrée (chaque région donc) la liste des magasins associés.

    Si tu travailles avec le framework 1.1, il faudra utiliser une Hashtable à la place du dictionnaire, ce dernier étant apparu avec le framework 2.0 et les génériques

  13. #13
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    ou alors :


    int i=0;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    While (i < listeMagasins.Count)
    {
       string region = listeMagasins[i].Region;
       //affiche la région
     
      while(i<listeMagasins.Count && string.Equals(listeMagasins[i].Region, region))
      {
       //afficheMagasin
       i++;
      }
     
     
    }

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Utilise un dictionnaire, en utilisant la clé comme libellé de la région et comme valeur la liste des magasins de la région.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dictionary<string, List<Magasin>> regions;
    Après pour l'utilisation, en admettant que la région soit indiqué au niveau du magasin (avec une propriété Region de type string renvoyant le libellé de la région pour l'exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach(Magasin m in listMagasins)
    {   
        if (!regions.Contains(m.Region))
        {
            regions[m.Region] = new List<Magasin>();
        }  
        regions[m.Region].Add(m);
    }
    Tu auras ainsi une entrée par région dans le dictionnaire et pour chaque entrée (chaque région donc) la liste des magasins associés.

    Si tu travailles avec le framework 1.1, il faudra utiliser une Hashtable à la place du dictionnaire, ce dernier étant apparu avec le framework 2.0 et les génériques


    Hey parfait ça fonctionne très bien
    Par contre j'ai une question bête (encore ? ) mais comment serialise t'on un dictionnaire de ce type avec XmlSerializer ?
    j'ai lu que ce n'était pas possible : est ce vrai ?

  15. #15
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Oui, la classe Dictionary<K, V> n'est pas sérialisable en XML. Il existe des implémentations de dictionnaires sérialisables il me semble, avec un peu de google ça doit se trouver.

Discussions similaires

  1. [OL-2010] Personnalisation regroupement par champ objet tronqué
    Par acgen dans le forum Outlook
    Réponses: 0
    Dernier message: 11/02/2015, 16h59
  2. Réponses: 10
    Dernier message: 25/05/2010, 14h25
  3. regrouper les objets d'un arraylist
    Par moonila dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 19/06/2009, 10h52
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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