Je trouve cela SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
et Dictionary<TKey, TValue>
implémente les mêmes interfaces.
- Quand devrions-nous opter pour
SortedList
etSortedDictionary
plusDictionary
? - Quelle est la différence entre
SortedList
etSortedDictionary
en termes d'application?
Réponses:
Lors de l'itération sur les éléments de l'un des deux, les éléments seront triés. Pas si avec
Dictionary<T,V>
.MSDN traite la différence entre
SortedList<T,V>
etSortedDictionary<T,V>
:la source
SortedList
vous pouvez récupérer par index (par opposition à récupération par clé) et dansSortedDictionary
vous ne pouvez pas.Je mentionnerais la différence entre les dictionnaires.
L'image ci-dessus montre que
Dictionary<K,V>
c'est égal ou plus rapide dans tous les cas que l'Sorted
analogique, mais si l'ordre des éléments est nécessaire, par exemple pour les imprimer,Sorted
un est choisi.Src: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html
la source
Immutable
versions de ces dictionnaires, lesSorted
versions sont souvent en réalité plus rapides d'environ 40 à 50% que les homologues non triés (toujoursO(log(n))
, mais nettement plus rapides par opération) . Cependant, les horaires peuvent différer en fonction du tri de l'entrée. Voir stackoverflow.com/a/30638592/111575Pour résumer les résultats d'un test de performance - SortedList vs SortedDictionary vs Dictionary vs Hashtable , les résultats du meilleur au pire pour différents scénarios:
Utilisation de la mémoire:
Insertions:
Opérations de recherche:
opérations de boucle foreach
la source
Collection
besoin de l'être,sorted
vous pouvez oublierHashtable
etDictionary
: si vous remplissez votre collection d'un seul coup -> optez pour SortedList, mais si vous prévoyez que vous aurez souvent besoin de.Add
et d'.Remove
éléments -> optez pour SortedDictionary.sorted
signifie: lorsque vous faites aFor Each MyItem in Collection
plutôt que d'être traité dans l'ordre dans lequel vous avez initialement.Add
édité les éléments, asorted
Collection
les traitera dans un ordre selon des critères sur lesKey
valeurs (définis dans unIComparer
). Par exemple, si vos clés sont des chaînes, votre collection sera par défaut traitée selon l'ordre alphabétique de vos clés, mais vous pouvez toujours définir une règle de tri personnalisée.Lorsque vous souhaitez que la collection soit triée par clé lorsque vous la parcourez. Si vous n'avez pas besoin de trier vos données, vous êtes mieux avec juste un dictionnaire, il aura de meilleures performances.
SortedList et SortedDictionary font à peu près la même chose, mais sont implémentés différemment, ont donc des forces et des faiblesses différentes expliquées ici .
la source
Je vois que les réponses proposées se concentrent sur la performance. L'article fourni ci-dessous n'apporte rien de nouveau concernant les performances, mais il explique les mécanismes sous-jacents. Notez également qu'il ne se concentre pas sur les trois
Collection
types mentionnés dans la question, mais aborde tous les types de l'System.Collections.Generic
espace de noms.http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Extraits:
Dictionnaire <>
SortedDictionary <>
SortedList <>
Résumé provisoire des procédures sous-jacentes
Les commentaires sont les bienvenus car je suis sûr que je n'ai pas tout bien fait.
n
.dictionnaire
Mémoire
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Ajouter
HashArray(n) = Key.GetHash
# O (1)KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)Retirer
For i = 0 to n
, trouvei
oùHashArray(i) = Key.GetHash
# O (log n) (tableau trié)HashArray(i)
# O (n) (tableau trié)KeyArray(i)
# O (1)ItemArray(i)
# O (1)Obtenir l'article
For i = 0 to n
, trouvei
oùHashArray(i) = Key.GetHash
# O (log n) (tableau trié)ItemArray(i)
Boucle à travers
For i = 0 to n
, revenirItemArray(i)
SortedDictionary
Mémoire
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Ajouter
KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)For i = 0 to n
, trouvei
oùKeyArray(i-1) < Key < KeyArray(i)
(en utilisantICompare
) # O (n)OrderArray(i) = n
# O (n) (tableau trié)Retirer
For i = 0 to n
, trouveri
oùKeyArray(i).GetHash = Key.GetHash
# O (n)KeyArray(SortArray(i))
# O (n)ItemArray(SortArray(i))
# O (n)OrderArray(i)
# O (n) (tableau trié)Obtenir l'article
For i = 0 to n
, trouveri
oùKeyArray(i).GetHash = Key.GetHash
# O (n)ItemArray(i)
Boucle à travers
For i = 0 to n
, revenirItemArray(OrderArray(i))
SortedList
Mémoire
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Ajouter
For i = 0 to n
, trouvei
oùKeyArray(i-1) < Key < KeyArray(i)
(en utilisantICompare
) # O (log n)KeyArray(i) = PointerToKey
# O (n)ItemArray(i) = PointerToItem
# O (n)Retirer
For i = 0 to n
, trouveri
oùKeyArray(i).GetHash = Key.GetHash
# O (log n)KeyArray(i)
# O (n)ItemArray(i)
# O (n)Obtenir l'article
For i = 0 to n
, trouvei
oùKeyArray(i).GetHash = Key.GetHash
# O (log n)ItemArray(i)
Boucle à travers
For i = 0 to n
, revenirItemArray(i)
la source
En essayant d'attribuer un score de performance à chaque cas présenté par @Lev, j'ai utilisé les valeurs suivantes:
Les résultats sont (plus élevé = meilleur):
Bien entendu, chaque cas d'utilisation donnera plus de poids à certaines opérations.
la source