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

Linq Discussion :

Sort d'une collection d'objets contenant chacun une collection


Sujet :

Linq

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 44
    Points
    44
    Par défaut Sort d'une collection d'objets contenant chacun une collection
    Bonjour,

    Désolé pour le titre, je suis pas certain que ce soit clair. J'en suis même sûr...
    Mais je vais tenter de clarifier la chose.

    J'ai une collection A contient des objets de type ItemA.
    Chaque ItemA contient une collection B contenant des objets de type ItemB.

    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
    public class A : List<ItemA>
    {
    }
     
    public class ItemA
    {
        private string mCaption;
        private B ListB = new B();
    }
     
    public class B: List<ItemB>
    {
    }
     
    public class ItemB
    {
        private string mType;
    }


    Je souhaiterais pourvoir faire un sort de ma collection A en Linq sur une propriété de l'objet ItemB.

    Est-ce possible ? Avez vous besoin que j'apporte d'autres explications ?

    Merci pour votre aide.

  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
    Si je ne me trompe pas, la solution la plus simple serait d'implémenter l'interface IComparer au niveau de la classe ItemA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class ItemA : System.Collections.IComparer
    {
        public int Compare(object x, object y)
        {
     
        }
    }
    Ainsi, tu aurais toute la flexibilité pour comparer comme bon te semble deux listes de ItemB.

    De cette façon, tu pourras écrire la requête Linq suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var query = myList.OrderBy(item => item);
    Plus d'information sur l'interface IComparer : http://msdn.microsoft.com/fr-be/libr...icomparer.aspx

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Merci pour votre réponse.

    J'ai commencé le .net il y a un an et je ne connais pas du tout l'interface IComparer et bien que clairement expliqué, j'essaie d'en comprendre l'intérêt

    Je précise juste que je n'ai pas deux listes distinctes, mais seulement une List<> A qui contient une propriété B de type ListB <ItemB>
    Je souhaite trier uniquement A sur la propriété Type de l'objet ItemB.

    Je me demande encore même si c'est logique et faisable.
    Pour vous dire le chemin qu'il me reste à faire...

    Je retourne lire la doc

  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
    Citation Envoyé par seblo_scoqi Voir le message
    Merci pour votre réponse.

    J'ai commencé le .net il y a un an et je ne connais pas du tout l'interface IComparer et bien que clairement expliqué, j'essaie d'en comprendre l'intérêt

    Je précise juste que je n'ai pas deux listes distinctes, mais seulement une List<> A qui contient une propriété B de type ListB <ItemB>
    Je souhaite trier uniquement A sur la propriété Type de l'objet ItemB.

    Je me demande encore même si c'est logique et faisable.
    Pour vous dire le chemin qu'il me reste à faire...

    Je retourne lire la doc
    Le orderby peut comparer automatiquement des types dits primitifs tel que int, short, float, decimal, etc mais aussi string. Par contre, dans le cas de type custom, telle qu'une classe développée par un développeur, il est impossible pour le framework de faire une comparaison intelligente.

    C'est là que l'interface IComparer devient intéressante car tu vas pouvoir définir le définir l'implémentation de la comparaison entre deux objets d'un type que tu as défini, exemple ItemA.

    Donc si je reprends ta méthode Compare de tout à l'heure, tu vas pouvoir faire la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public int Compare(object x, object y)
    {
         ItemA itemaX = (ItemA)x;
         ItemA itemaY = (ItemA)y;
     
         // ainsi tu peux accéder à la sous liste des ItemB des deux classe en cours de comparaison
         // itemaX.ListB
         // itemaY.ListB
     
         // et renvoyer 1, 0 ou -1 suivant ce que ton "algo" de comparaison a déterminé
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Merci beaucoup pour ces explications... Je vais essayer.

    Pour expliciter mon problème de façon plus concrète.

    J'ai une liste de catalogue (list<> a) avec plusieurs propriétés, nom, date de creation (...) et une propriété (list<> b) qui contient tous les types de ce catalogue. Par exemple le catalogue "logitech" peut contenir les types "accessoires, périphériques,...".

    Et sur un listing des catalogues, il est intéressant de pouvoir les trier par type...

    Bien entendu, cette propriété Type est dynamique et varie largement selon les catalogues(...)

    Je voulais juste remettre mon besoin dans son contexte

    Merci encore pour ton aide.

  6. #6
    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
    Citation Envoyé par seblo_scoqi Voir le message
    Merci beaucoup pour ces explications... Je vais essayer.

    Pour expliciter mon problème de façon plus concrète.

    J'ai une liste de catalogue (list<> a) avec plusieurs propriétés, nom, date de creation (...) et une propriété (list<> b) qui contient tous les types de ce catalogue. Par exemple le catalogue "logitech" peut contenir les types "accessoires, périphériques,...".

    Et sur un listing des catalogues, il est intéressant de pouvoir les trier par type...

    Bien entendu, cette propriété Type est dynamique et varie largement selon les catalogues(...)

    Je voulais juste remettre mon besoin dans son contexte

    Merci encore pour ton aide.
    Ma réponse a répondu à ta question ?
    J'ai l'impression que tu es toujours dans le flou

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Je pense que oui, même si j'essaie de trouver des solutions en Linq uniquement...

    Par exemple avec quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var sorted = from c in A
                 let mostCommonType = (from c1 in c.B
                                       group c1.Type by c1.Type into g
                                       orderby g.Count() descending
                                       select g.Key).FirstOrDefault()
                 orderby selector(c), mostCommonType
                 select c;
    Mais qui ne convient pas...

    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            var sorted = from c in A orderby selector(c), GetValueWeWantToOrderBy(c.B) select c;
     
        public static String GetValueWeWantToOrderBy(B listB)
        {
            return String.Join("", listB.Select(item => item.mType));
        }
    Bref, je me borne un peu au linq, dans le cas présent.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Les contraintes de la base de données font que je dois avoir :
    Une table SQL "Type" qui contient une colonne "ContentType" et une colonne "IdCatalog".
    Une table SQL "Catalog" qui contient une colonne "Id" et une colonne "Name".

    Tu l'auras compris, pour un catalogue, j'ai plusieurs types qui peuvent être ajouter/modifier/supprimer pour ce même catalogue

    Ces données doivent être représentées sous forme d'une table Html avec une colonne "IdCatalog" et toutes les colonnes "Types".

    La représentation est tabulaire mais les données et le modèle objet ne le sont pas. Et la difficulté est de trier ce tableau, avec le modèle object que j'ai construit...

    Je pense que la meilleure méthode serait de construire un dataset à partir de mon jeu de données et ainsi travailler avec une vraie structure tabulaire. Ce qui me simplifierait grandement la vie.

Discussions similaires

  1. Comment binder à un DataGrid une collection d'objets accessible par une clé
    Par zoaax dans le forum Windows Presentation Foundation
    Réponses: 16
    Dernier message: 14/01/2011, 11h00
  2. Réponses: 2
    Dernier message: 07/10/2008, 13h17
  3. Réponses: 2
    Dernier message: 29/05/2008, 15h59
  4. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11

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