SortedList pas le tri sur la touche - VB.NET
-
21-08-2019 - |
Question
J'ai la nécessité d'une paire de valeurs clés que je veux trier alors j'ai décidé d'utiliser un SortedList au lieu d'un Hashtable.
J'ajoute les données dans l'ordre ci-dessous pour mon SortedList qui est l'ordre que j'ai besoin dans
Key | Value
--------------------------------
1 "700-800" | List(Of Object)
2 "900-1000" | List(Of Object)
3 "1100-1200" | List(Of Object)
4 "1700-1800" | List(Of Object)
5 "1900-2000" | List(Of Object)
La clé est une chaîne et la valeur est une liste d'objets. La clé représente une tranche de temps qui a été concaténé à partir de deux valeurs entières et délimitée par « - ». « 700 » comme une chaîne était 0700 initialement un entier.
par exemple.
Dim key As String = slotTimeStart.ToString() & "-" & slotTimeEnd.ToString()
Mais une fois que ces paires de valeurs clés sont ajoutés à la SortedList qu'ils apparaissent dans l'ordre
3 "1100-1200" | List(Of Object)
4 "1700-1800" | List(Of Object)
5 "1900-2000" | List(Of Object)
1 "700-800" | List(Of Object)
2 "900-1000" | List(Of Object)
Malheureusement, je reçois les créneaux horaires de fois que deux valeurs entières qui ne peuvent pas être modifiés.
Est-il possible de forcer une sorte sur un SortedList? ou est-ce problème en raison de la façon dont je stocke ma clé? Y at-il une meilleure façon de le stocker?
La solution
Créer un mais SortedList(Of String, List(Of Object))
passe dans un IComparer(Of String)
à
Autres conseils
Il semble que vous les trier par ordre alphabétique au lieu de numériquement. Vous devrez faire votre touche numérique pour obtenir l'ordre de tri que vous cherchez.
Les temps qui sont à moins de 4 chiffres ont besoin d'être préfixé avec un zéro ( « 0 ») pour les rendre la même longueur que ceux avec 4 chiffres. De cette façon, le comparateur norme comparera ombles 1 de chaîne 1 qui va maintenant être 0 en char 1 de chaîne 2 qui sera 1 et la chaîne 1 sortira en premier.
pourraient être les clés décimales et ressembler à
7.08
9.1
11.12
17.18
19.20
et convertir et le format de chaîne selon les besoins.
Dim sl As New SortedList(Of Decimal, Object)
'sample data
For x As Integer = 7 To 20 Step 2
sl.Add(CDec(x + ((x + 1) / 100)), New Object)
Next
Dim aKey As Decimal
Dim slotStart As DateTime = #1:00:00 PM#
Dim slotEnd As DateTime = #2:00:00 PM#
aKey = CDec(slotStart.Hour + (slotEnd.Hour / 100))
sl.Item(aKey) = New Object