UTILISATION DE SORTEDLIST POUR TRIER UNE COLLECTION DE VALEURS DÉCOMPOSÉES DE SO

cs_marcA Messages postés 12 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 3 août 2010 - 3 août 2010 à 10:24
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 - 13 août 2010 à 14:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52136-utilisation-de-sortedlist-pour-trier-une-collection-de-valeurs-decomposees-de-sous-valeurs

blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 1
13 août 2010 à 14:03
Tout en restant dans l'utilisation de SortedList, qui n'est peut-être pas le meilleur choix, j'utilise ContainsKey avant d'ajouter un nouvel élément à la liste. Ce qui me permet de modifier la clef :

ct = 1
originalKey = theKey

Do While theSortedList.ContainsKey(theKey) = True
ct = ct + 1
theKey = originalKey & ct
Loop

Call theSortedList.Add(theKey, theValue)
cs_marcA Messages postés 12 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 3 août 2010
13 août 2010 à 08:01
Dans ce cas, il ne faut pas faire une sortedlist, mais une simple liste et utiliser la fonction sort
List.Sort (New CClassComparer)

Et la classe CComparer est ainsi
Friend Class CClassComparer

' Implements the manual sorting of items by columns.
Implements IComparer(Of CClass)

Public Function Compare(ByVal x As CClass, ByVal y As CClass) As Integer Implements IComparer(Of CClass).Compare

If x.Value > y.Value Then
Return 1
ElseIf x.Value < y.Value Then
Return -1
Else
Return 0
End If

End Function

End Class
donkeises Messages postés 1 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 12 août 2010
12 août 2010 à 22:40
Bonjour,

Pouvez vous m'aider avec mon code! je voudrais utiliser une sortedlist sauf que j'ai des clés identique des fois! comment puis je modifier la fonction sortedlidt
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 1
9 août 2010 à 18:21
Une annotation tout de même sur ce code. Je souhaitais juste donner un exemple d'utilisation de SortedList, mais mon exemple à une grosse limitation. Le trie via SortedList implique que les clefs soient uniques, donc une même valeur posera un souci à l'ajout.

Pour améliorer cela, un test peut-être ajouter par vérification de l'existence de la clef (theSortedList.ContainsKey), mais dans mon exemple, cela fausse la valeur de trie. Je ferais mieux la prochaine fois.

' 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 : attention la clef doit être unique...
' Donc, il faut l'incrémenter. L'incrément n'a pas d'incidence sur la Chaine d'origine.
' Il y a donc un problème, si trop de clefs de trie identiques...
theSortedValue = CLng(theInfo(thePos))

Do While theSortedList.ContainsKey(theSortedValue) = True
theSortedValue = theSortedValue + 1
Loop

Call theSortedList.Add(theSortedValue, theList(ct).ToString)
Next
cs_marcA Messages postés 12 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 3 août 2010
3 août 2010 à 11:28
Sans utiliser de clé, la List n'a qu'une seule différence par rapport à la collection, c'est que l'on travaille de 0 à n-1. Pour le reste, c'est pareil.
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 1
3 août 2010 à 11:18
L'utilisation de List (of...) ou Dictionary est sans doute bien mieux. Je n'ai pas encore ce niveau de connaissance. Il s'agit surtout d'illustrer SortedList sans nécessité de Clefs.
cs_marcA Messages postés 12 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 3 août 2010
3 août 2010 à 10:24
Bonjour,

Juste une question : Ce ne serait pas plus simple de créer une classe avec les différentes informations (une colonne Élève, une colonne mention, et une autre avec la valeur) et de trier à partir de ces valeurs plutôt que travailler sur des strings, les décomposer...).
Il y a aussi moyen dans ce cas de trier directement à partir d'une de ces valeurs. (LINQ par exemple)
Il est aussi préférable d'éviter d'utiliser les collections mais plus tôt les List (of...) ou des Dictionary (of ...) si on a besoin d'utiliser des clés.
Le gain en vitesse en utilisant du générique est impressionnant par rapport à l'utilisation des collections)