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 :

[VB.Net 2.0] Comment trier une collection générique sur plusieurs champs ?


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Février 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 79
    Par défaut [VB.Net 2.0] Comment trier une collection générique sur plusieurs champs ?
    Je ne saisi pas comment fonctionne IComparer pour trier les objets dans ma collection... Bon supposons les deux classes suivantes, bien simple:

    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 Nodes
       Inherits List(Of Node)
    End Class
     
    Public Class Node
       private _x, _y, _z As Double
     
       Public Property X as Double
       Get/Set _x
     
       Public Property Y as Double
       Get/Set _y
     
       Public Property Z as Double
       Get/Set _z
     
    End Class
    Comment je fais pour que lorsque je fais par exemple Nodes.Sort, ça trie tous les éléments Node d'abord par X croissant, après Y et après Z...
    Et est-ce que lorsque le tri s'effectue, les objets dans la collection garde bien leur adresse respective et seulement leur index change, de sorte que si d'autres objets font référence au différent "node", ils pointent toujours le bon?

    Merci!

  2. #2
    Membre actif
    Inscrit en
    Février 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 79
    Par défaut
    Bon, j'ai réussi à trouver comment faire.

    Il suffit d'implémenter IComparable dans la classe Node et modifier la méthode CompareTo correctement.

    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
    Public Class Node
    Implements IComparable
     
        Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
            Dim n2 As Node
            If obj.GetType IsNot GetType(Node) Then
                Throw New ArgumentException("Objet du mauvais type")
            Else
                n2 = CType(obj, Node)
            End If
     
            If Me.X <> n2.X Then
                Return Me.X.CompareTo(n2.X)
            ElseIf Me.Y <> n2.Y Then
                Return Me.Y.CompareTo(n2.Y)
            Else
                Return Me.Z.CompareTo(n2.Z)
            End If
     
        End Function
    End Class
    Et ensuite, Nodes.Sort fera l'affaire.

  3. #3
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    de ta contribution

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Juste une question, pour moi qui ne connait rien au VB.NET

    Cette ligne:

    Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo

    Veut-elle dire que la méthode CompareTo implémente System.IComparable.CompareTo

    C'est quoi l'intérêt d'une méthode qui implémente une méthode (d'ailleurs, on implémente une interface, pas une méthode...)

  5. #5
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par Morpheus
    Juste une question, pour moi qui ne connait rien au VB.NET

    Cette ligne:




    Veut-elle dire que la méthode CompareTo implémente System.IComparable.CompareTo

    C'est quoi l'intérêt d'une méthode qui implémente une méthode (d'ailleurs, on implémente une interface, pas une méthode...)
    Cette signature standard est nécessaire en VB.Net lorsque tu déclares ta classe par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Class MyClass
       Implements IComparable
    '...etc..
    C'est ainsi que le compilo retrouve ses petits certainement

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Ok donc c'est pour indiquer que cette méthode correspond à la méthode indiqué de l'interface si j'ai bien compris


    Vraiment bizarre le compilateur/la syntaxe VB.NET....

  7. #7
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par Morpheus
    Ok donc c'est pour indiquer que cette méthode correspond à la méthode indiqué de l'interface si j'ai bien compris
    Vraiment bizarre le compilateur/la syntaxe VB.NET....
    Comme dirait notre ami commun, ce cher Maniak, VB c'est verbeux

  8. #8
    Membre expérimenté Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Par défaut
    remarque ca évite certainement d'avoir à préciser quelle interface tu implémentes en cas d'ambiguité dans la signature de la méthode (ex en c#)

    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
    
    {
      void Run();
    }
    
    interface Developpez1
    {
      void Run();
    }
    
    class Interclash:Developpez,Developpez1
    {
      void Developpez.Run()
      {
        Console.WriteLine("Developpez.Run() method Implemented");
      }
    
      void Developpez1.Run()
      {
        Console.WriteLine("Developpez1.Run() method Implemented");
      }
    }
    
    mais il n'y a vraiment que dans ce rare cas, que cette lourde syntaxe a un sens... (ah vb....)

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

Discussions similaires

  1. Comment créer une sous requête sur plusieurs champs?
    Par Anonymouse dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 10/06/2008, 09h13
  2. Comment trier une collection avant de l'afficher ?
    Par piloupy dans le forum Struts 1
    Réponses: 10
    Dernier message: 04/05/2007, 08h51
  3. Réponses: 3
    Dernier message: 08/09/2006, 18h00
  4. [C#]Comment trier une collection?
    Par Cube55 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/06/2006, 19h18

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