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...!
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.