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

VB.NET Discussion :

Tri sur une list(of) avec classe perso


Sujet :

VB.NET

  1. #1
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut Tri sur une list(of) avec classe perso
    Bonjour et bon lundi!

    J'aimerais faire un tri sur une list. Voici ma structure pour vous mettre en contexte:

    J'ai une classe "Activité" qui contient les infos d'une activité, avec son temps de départ (integer)

    J'ai une classe "Projet" qui contient les infos du projet, ainsi que sa liste d'activité (List(of Activité))

    J'ai un module "ManagerProjet" qui contient une liste de projet (List(of Projet))

    J'aimerais faire un tri sur la liste de projet du "ManagerProjet", selon les temps de départ de l'activité 0 (soit la première activité de chaque projet), un peu comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListDeProjet.Sort(Sur Projet.ListActivité(0).Début)
    Y'a moyen de faire quelquechose du genre, ou devrais coder une fonction dans la classe projet qui me retourne le temps de départ? Ou autres idées?
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    tu peux implémenter un IComparer qui fait ça

  3. #3
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Ouais en lisant sur MSDN j'ai vu ça aussi, je connais pas par contre, je m'y mets!
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  4. #4
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Je suis en VS 2008 en passant, ça peut commencer à être important...

    Bon j'ai essayé ceci:

    J'ai créé ma classe comparatrice:

    ActiveList = Liste de Projet
    TaskList = Liste d'activité


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class SortListClass
        Implements IComparer
     
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            Return New CaseInsensitiveComparer().Compare(ActiveList(x).TaskList(0).StartTime, ActiveList(y).TaskList(0).StartTime)
        End Function
    End Class
    Ensuite j'ai utilisé cette classe pour faire mon tri:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Private Sub SortActiveList()
            Dim MyComparer As New SortListClass
            ActiveList.Sort(MyComparer)
        End Sub
    Il me lance une erreur de Cast par contre ( sur la ligne ActiveList.Sort(MyComparer))

    Unable to cast object of type 'GanttChartScheduling.SortListClass' to type 'System.Collections.Generic.IComparer`1[GanttChartScheduling.Basket]'.
    GanttChartScheduling.Basket = Classe de Projet (panier d'activité pour notre code...)
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    oula, je suis un peu perdu dans ton truc... a priori, les paramètres x et y sont des projets, non (apparemment tu as supposé que c'était des index ?) ? Avec un cast on y verrait plus clair...
    Et pourquoi utiliser CaseInsensitiveComparer pour comparer des dates ?
    Moi je ferais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Class SortListClass
        Implements IComparer
     
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            Dim projX as Projet = TryCast(x, Projet)
            Dim projY as Projet = TryCast(y, Projet)
            Dim startX As DateTime = projX.TaskList(0).StartTime        
            Dim startY As DateTime = projY.TaskList(0).StartTime
            Return DateTime.Compare(startX, startY)        
        End Function
    End Class

  6. #6
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Ouais désolé c'est mélangeant pour quelqu'un qui ne baigne pas dans mon truc, c'Est pas vraiment des projets, j'avais utilisé ça pour faire une comparaison..

    Citation Envoyé par tomlev Voir le message
    oula, je suis un peu perdu dans ton truc... a priori, les paramètres x et y sont des projets,
    En créant la classe et implémentant IComparer, il a créer la fonction automatiquement avec le x et le y. D'Après moi, étant caster Object, c'est n'importe quoi, moi dans mon cas, je veux trier la liste de paniers (projet), donc il y a une classe pour ça, soit Basket, mais je ne peux pas identifier ça bug

    non (apparemment tu as supposé que c'était des index ?) ?
    Je crois bien qu'il va prendre l'objet x et y dans son tri, soit le panier actif x et y, puis trier selon le temps de départ

    Avec un cast on y verrait plus clair...
    Et pourquoi utiliser CaseInsensitiveComparer pour comparer des dates ?
    Honnêtement je savais pas quoi utiliser, par contre oublie pas que c'est pas des dates mais bien des Integer (c'est des secondes)
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  7. #7
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    J'essaie avec ta suggestion de code!
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  8. #8
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Ok j'ai trouvé un premier bug: Étant donné que ma list est une liste de basket, il faut que j'implémente mon comparateur comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class SortListClass
        Implements IComparer(Of Basket)
     
        Public Function Compare(ByVal x As Basket, ByVal y As Basket) As Integer Implements System.Collections.Generic.IComparer(Of Basket).Compare
     
        End Function
    End Class
    Je sais pas quoi retourné et comment comparé encore par contre...Au moins à l'exécution, pas d'erreur, il tri, mais là je ne sais pas sur quoi il fait son tri...
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  9. #9
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    J'me pose une question par contre:

    Étant donné que la fonction compare est une integer, je dois donc retourner un Integer. Et ça, VS le crée automatiquement, c'est pas moi qui choisit de mettre une fonction integer. Donc, dans ma fonction, je peux comparer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            If x.TaskList(0).StartTime < y.TaskList(0).StartTime Then
                'Return x
            Else
                'Return y
            End If
    Mais le Return, je sais pas quoi mettre pour integer...
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  10. #10
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Citation Envoyé par Faladin Voir le message
    Mais le Return, je sais pas quoi mettre pour integer...
    Sur MSDN j'ai trouvé:

    Return Value
    Type: System..::.Int32

    Value Condition

    Less than zero: x is less than y.

    Zero: x equals y.

    Greater than zero: x is greater than y.
    --- --- ---

    Et voici le code fonctionnel (les Return sont en fonction de ce que j'ai trouvé sur MSDN!)

    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 SortListClass
        Implements IComparer(Of Basket)
     
        Public Function Compare(ByVal x As Basket, ByVal y As Basket) As Integer Implements System.Collections.Generic.IComparer(Of Basket).Compare
            If x.TaskList(0).StartTime < y.TaskList(0).StartTime Then
                Return -1
            ElseIf x.TaskList(0).StartTime = y.TaskList(0).StartTime Then
                Return 0
            Else
                Return 1
            End If
        End Function
    End Class
     
        Private Sub SortActiveList()
            Dim MyComparer As New SortListClass
            ActiveList.Sort(MyComparer)
        End Sub
    Merci Tomlev pour ton coup de main!
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

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

Discussions similaires

  1. Tri sur une liste chainée
    Par Leclandestin dans le forum C++
    Réponses: 5
    Dernier message: 21/03/2011, 18h22
  2. [FORMULAIRE]Tri sur une liste dans un formulaire Access
    Par roidesizzets dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/06/2009, 12h35
  3. Tri sur une liste d'objet
    Par Poussy-Puce dans le forum C#
    Réponses: 4
    Dernier message: 12/05/2008, 17h35
  4. tri sur une list
    Par lastrecrue dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2007, 08h44

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