2009-12-28 7 views
1

J'utilise un SortedDictonary (Of String, String) dans mon application et mon comportement de tri est étrange. Prenons l'exemple de code suivant:comportement SortedDictionary

Dim Dic As New SortedDictionary(Of String, String) 
Dic.Add("'A", "") 
Dic.Add("A", "") 
Dic.Add("'B", "") 
Dic.Add("B", "") 
Dic.Add("'C", "") 
Dic.Add("C", "") 

je me attends les clés à trier comme 'A »,' B», «C», "A", "B", "C", qui est ce que vous obtenez en comparant les clés "à la main", à travers l'opérateur <. Et pourtant, iterating à travers les touches retourne "A", "A", "B", "B", "C", "C". Comment puis-je modifier le comportement SortedDictionary pour trier les mots commençant par ' en premier?

Merci, CFP

Répondre

4

Dans mon répertoire téléphonique, sortes John O'Leary entre Ole Tracteurs et Dennis Oleck. Vous devrez utiliser un tri non dépendant de la culture:

Dim Dic As New SortedDictionary(Of String, String)(StringComparer.Ordinal) 
+1

En effet, je n'y ai pas pensé. Merci beaucoup! –

0

Chaque clé dans un SortedDictionary(TKey, TValue) doit être unique selon le comparateur par défaut. SortedDictionary (TKey, TValue) requiert une implémentation du comparateur pour effectuer des comparaisons de clés.

Ce constructeur utilise le comparateur d'égalité générique par défaut (dépendant de la culture locale). Comparer (T) .Default. Si le type TKey implémente l'interface générique System.IComparable (T), le comparateur par défaut utilise cette implémentation. Vous pouvez également spécifier une implémentation de l'interface générique IComparer (T) en utilisant un constructeur qui accepte un paramètre de comparaison.

Dim Dic As New SortedDictionary(Of String, String)(StringComparer.Ordinal) 
Dic.Add("'A", "") 
Dic.Add("A", "") 
Dic.Add("'B", "") 
Dic.Add("B", "") 
Dic.Add("'C", "") 
Dic.Add("C", "") 


For Each Item As KeyValuePair(Of String, String) In Dic 
    Console.WriteLine(Item.Key & " > " & Item.Value) 
Next 

Sortie:

'A > 
'B > 
'C > 
A > 
B > 
C > 
1

Vous devez spécifier un autre comparateur:

Dim Dic As New SortedDictionary(Of String, String)(StringComparer.Ordinal)