Gestion des listes : rangement (list.sort) et filtrage (list.findall)

Description

Petit programme (VB 2008) qui remplace les discours à l'usage des novices pour utiliser pleinement les possibilités des listes (Sort et FindAll).

La liste utilisée est une liste de Fiches (Nom, Prénom, Age, Ville, Département) qu'on classe à volonté par nom, prénom, age, ville, département où qu'on filtre pour ne garder que les fiches des bourguignons.

Source / Exemple :


Imports System.Windows.Forms.Application 'pour DoEvents()

Public Class Form1

    Structure Fiche
        Dim Nom As String
        Dim Prénom As String
        Dim Age As Integer
        Dim Dép As Integer
        Dim Ville As String
        Public Sub New(ByVal n As String, ByVal p As String, ByVal a As Integer, ByVal d As Integer, ByVal v As String)
            Me.Nom = n
            Me.Prénom = p
            Me.Age = a
            Me.Dép = d
            Me.Ville = v
        End Sub 'constructeur d'une nouvelle fiche
    End Structure 'fiche d'ID pour les essais, avec constructeur NEW

    'variables globales
    Dim LF As New List(Of Fiche) 'liste des Fiches à classer
    Dim LFT As New List(Of Fiche) 'liste des Fiches triées ou filtrées (qui seront affichées)

    'boutons :
    Private Sub ButtonNoms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNoms.Click
        'tri par nom
        RecopieListeLF()
        LFT.Sort(AddressOf CompareNoms)
        ActualiseListBox()
    End Sub 'tri de la liste LFT par nom
    Private Sub ButtonPrénoms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonPrénoms.Click
        'tri par prénom
        RecopieListeLF()
        LFT.Sort(AddressOf ComparePrénoms)
        ActualiseListBox()
    End Sub 'tri de la liste LFT par prénom
    Private Sub ButtonAges_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAges.Click
        'tri par age
        RecopieListeLF()
        LFT.Sort(AddressOf CompareAges)
        ActualiseListBox()
    End Sub 'tri de la liste LFT par age
    Private Sub ButtonVilles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonVilles.Click
        'tri par ville
        RecopieListeLF()
        LFT.Sort(AddressOf CompareVilles)
        ActualiseListBox()
    End Sub 'tri de la liste LFT par ville
    Private Sub ButtonDepartements_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDepartements.Click
        'tri par département
        RecopieListeLF()
        LFT.Sort(AddressOf CompareDépartements)
        ActualiseListBox()
    End Sub 'tri de la liste LFT par département
    Private Sub ButtonFiltre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonFiltre.Click
        'filtrer la liste en ne gardant que les départements de Bourgogne (21,71,89,58)
        LFT.Clear()
        LFT = LF.FindAll(AddressOf FiltreBourgogne) 'ne garde que les éléments qui conviennent
        ActualiseListBox()
    End Sub 'filtrer la liste en ne gardant que les départements de Bourgogne (21,71,89,58)

    'fonctions :
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'initialisation des fiches et des listes :
        Dim f, g, h, i, j As Fiche

        'on pourrait écrire LF.Add(New Fiche("Térieur", "Alex", 21, 71, "Chalon")) mais cela risque d'entrainer
        'des fuites de mémoire...car il semble que la mémoire de la nouvelle fiche ne soit pas libérée si NEW est
        'un paramètre d'une fonction

        f = New Fiche("Térieur", "Alex", 21, 71, "Chalon")
        LF.Add(f)

        g = New Fiche("Térieur", "Alain", 22, 25, "Besançon")
        LF.Add(g)

        h = New Fiche("Enfaillite", "Mélusine", 58, 89, "Sens")
        LF.Add(h)

        i = New Fiche("Marollex", "Eléonore", 15, 75, "Paris")
        LF.Add(i)

        j = New Fiche("Fonfec", "Sophie", 48, 39, "Saint-Claude")
        LF.Add(j)

        RecopieListeLF() ' recopie dans LFT
        ActualiseListBox() 'au début, la liste LFT n'est pas triée...elle est identique à LF
    End Sub
    Private Sub RecopieListeLF()
        'recopie la liste LF dans la liste LFT
        Dim i As Integer

        LFT.Clear()
        For i = 0 To LF.Count - 1
            LFT.Add(LF(i))
        Next
    End Sub
    Private Sub ActualiseListBox()
        'permet l'affichage de la liste LFT
        Dim i As Integer

        ListBoxFiches.Items.Clear()

        For i = 0 To LFT.Count - 1
            ListBoxFiches.Items.Add(LFT(i).Prénom & ", " & _
                                    LFT(i).Nom & ", " & _
                                    CStr(LFT(i).Age) & " ans, " & _
                                    LFT(i).Ville & ", " & _
                                    CStr(LFT(i).Dép))
        Next
        ListBoxFiches.Refresh()
        DoEvents()
    End Sub 'permet de rafraichir l'affichage de la liste LFT dans le ListBox
    Private Function CompareNoms(ByVal f As Fiche, ByVal g As Fiche) As Integer
        'retour : 0 si chaines égales
        '       : -1 si f.nom < g.nom
        '       : +1 si f.nom > g.nom
        Return String.Compare(f.Nom, g.Nom)
    End Function
    Private Function ComparePrénoms(ByVal f As Fiche, ByVal g As Fiche) As Integer
        ' mêmes conditions de retour
        Return String.Compare(f.Prénom, g.Prénom)
    End Function
    Private Function CompareVilles(ByVal f As Fiche, ByVal g As Fiche) As Integer
        ' mêmes conditions de retour
        Return String.Compare(f.Ville, g.Ville)
    End Function
    Private Function CompareAges(ByVal f As Fiche, ByVal g As Fiche) As Integer
        'retour : 0 si ages égaux
        '       : -1 si f.age < g.age
        '       : +1 si f.age > g.age
        Return IIf(f.Age = g.Age, 0, IIf(f.Age < g.Age, -1, 1))
    End Function
    Private Function CompareDépartements(ByVal f As Fiche, ByVal g As Fiche) As Integer
        Return IIf(f.Dép = g.Dép, 0, IIf(f.Dép < g.Dép, -1, 1))
    End Function

    Private Function FiltreBourgogne(ByVal f As Fiche) As Boolean
        If f.Dép = 21 Or f.Dép = 71 Or f.Dép = 58 Or f.Dép = 89 Then
            Return True 'à garder
        Else
            Return False 'à laisser
        End If
    End Function

End Class

Conclusion :


C'est uniquement pédagogique...!

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.