Il s'agit d'un exemple d'utilisation de SortedList réalisé avec VB Express 2010.
L'objectif est de passer en argument un objet Collection composé de chaines de String.
Chaque item (String) de la Collection est composée de plusieurs items.
Chaque item est décomposé par un caratère séparateur, par exemple | (pipe)
Ma Collection est créée avec les informations suivantes :
Eleve chose|mention du coin|12
Eleve machin|pas de mention|5
Eleve truc|mention bidule|19
Eleve du bol|mention a rien|1
je souhaite faire un tri sur la troisième info et obtenir la liste suivante:
Eleve du bol|mention a rien|1
Eleve machin|pas de mention|5
Eleve chose|mention du coin|12
Eleve truc|mention bidule|19
ou obtenir la liste (Collection) inverse :
Eleve truc|mention bidule|19
Eleve chose|mention du coin|12
Eleve machin|pas de mention|5
Eleve du bol|mention a rien|1
Mon objectif est donc d'utiliser un élément de chaque item de ma Collection, comme paramètre d'un trie croissant ou décroissant, comme des notes dans mon exemple.
Source / Exemple :
Imports System.Collections.Generic
Module TrierCollection
#Region "Trier une Collection"
' --------------------------------------------------------------------------------------------------
' Effectue un trie du contenu de la Collection passé en argument,
' avec précision de la position de l'argument de trie :
' la valeur de chaque item de la Collection est composée de plusieurs chaines séparées, dont
' l'élément qui servira au trie
'
Public Function SortThisCollByArgu(ByRef theList As Collection, ByVal thePos As Integer, _
Optional ByVal theSeparator As String = "|", _
Optional ByVal smallToHigh As Boolean = False) As Boolean
Dim ct As Integer, theInfo() As String
Dim theSortedList As New SortedList(Of Long, String)
SortThisCollByArgu = False
Try
' If Not theList Is Nothing Then
If Not theList Is Nothing Then
' Test nombre d'argument en cohérence avec la position de trie
theInfo = Split(theList(1).ToString, theSeparator)
If thePos > theInfo.GetUpperBound(0) Then Exit Function
' Boucle sur la Collection
For ct = 1 To theList.Count
' Récupération formatée des informations
theInfo = Split(theList(ct).ToString, theSeparator)
' Ajout dans la liste automatiquement triée, de la valeur de trie
' et de la chaine originale
Call theSortedList.Add(CLng(theInfo(thePos)), theList(ct).ToString)
Next
' Recréation de la liste pour ajout des valeurs dans l'odre
Call theList.Clear()
If smallToHigh = True Then
' Du plus grand au plus petit
For ct = theSortedList.Count - 1 To 0 Step -1
Call theList.Add(theSortedList.Values(ct))
Next
Else
' Du plus petit au plus grand : par défaut
For ct = 0 To theSortedList.Count - 1
Call theList.Add(theSortedList.Values(ct))
Next
End If
SortThisCollByArgu = True
End If
Catch Err As Exception
Call addError(Err.Message)
End Try
End Function
#End Region
End Module
Conclusion :
j'utilise SortedList pour créer une liste triée en passant la valeur de trie désignée par la position (thePos) comme Clef et en réinjectant la chaine d'origine comme Valeur (theList(ct).ToString). De ce faite, le parcours de la nouvelle liste (dans un sens ou dans l'autre) permet d'avoir un trie de ma liste d'origine.
Les options de la fonction me permettent d'une part de choisir un séparateur en fonction de la liste d'origine, mais aussi la position qui détermine la valeur du trie.
Cela peut aussi fonctionner avec une chaine de caractères en modifiant la déclaration de theSortedList par SortedList(Of String, String), sans omettre de supprimer la conversion Clng (mais l'éditeur de VB Express donnera une erreur en cas de conversion de type non autorisée).
l'utilisation de theList.Clear() peut tout de même être dangereux, si une exception se produit après, la liste est perdue. Une variante serait de renvoyer une nouvelle liste et non un Boolean.
il y a sans doute d'autres façon plus élégante d'écrite un code de trie d'une Collection, je laisse les autres contributeurs pour compléter cela.
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.