Encuentro eso SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
e Dictionary<TKey, TValue>
implemento las mismas interfaces.
- ¿Cuándo debemos optar por una
SortedList
ySortedDictionary
otra vezDictionary
? - ¿Cuál es la diferencia entre
SortedList
ySortedDictionary
en términos de aplicación?
Respuestas:
Al iterar sobre los elementos en cualquiera de los dos, los elementos se ordenarán. No es así con
Dictionary<T,V>
.MSDN aborda la diferencia entre
SortedList<T,V>
ySortedDictionary<T,V>
:fuente
SortedList
usted puede recuperar por índice (en contraposición a la recuperación por clave) y enSortedDictionary
usted no puede.Mencionaría la diferencia entre diccionarios.
La imagen de arriba muestra que
Dictionary<K,V>
es igual o más rápido en todos los casos que elSorted
analógico, pero si se requiere el orden de los elementos, por ejemplo, para imprimirlos,Sorted
se elige uno.Src: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html
fuente
Immutable
versiones de estos diccionarios, lasSorted
versiones a menudo son en realidad un 40-50% más rápidas que las contrapartes no clasificadas (aúnO(log(n))
, pero notablemente más rápidas por operación) . Sin embargo, los tiempos pueden diferir dependiendo de qué tan ordenada esté la entrada. Ver stackoverflow.com/a/30638592/111575Para resumir los resultados de una prueba de rendimiento: SortedList vs SortedDictionary vs Dictionary vs Hashtable , los resultados de mejor a peor para diferentes escenarios:
Uso de memoria:
Inserciones:
Operaciones de búsqueda:
operaciones de bucle foreach
fuente
Collection
necesitasorted
, puede olvidarse deHashtable
yDictionary
: si llena su Colección de una sola vez -> vaya a SortedList, pero si anticipa que a menudo necesitará.Add
y.Remove
elementos -> vaya a SortedDictionary.sorted
significa: cuando hace un enFor Each MyItem in Collection
lugar de ser procesado en el orden en que editó originalmente.Add
los elementos, asorted
Collection
los procesará en un orden de acuerdo con los criterios de losKey
valores (definidos en unIComparer
). Por ejemplo, si sus claves son cadenas, su colección se procesará de forma predeterminada según el orden alfabético de sus claves, pero siempre puede definir una regla de clasificación personalizada.Cuando desee que la colección se ordene por clave al iterar sobre ella. Si no necesita que se ordenen sus datos, estará mejor con solo un diccionario, tendrá un mejor rendimiento.
SortedList y SortedDictionary hacen prácticamente lo mismo, pero se implementan de manera diferente, por lo que tienen diferentes fortalezas y debilidades que se explican aquí .
fuente
Puedo ver que las respuestas propuestas se centran en el rendimiento. El artículo que se proporciona a continuación no proporciona nada nuevo con respecto al rendimiento, pero explica los mecanismos subyacentes. También tenga en cuenta que no se centra en los tres
Collection
tipos mencionados en la pregunta, sino que aborda todos los tipos delSystem.Collections.Generic
espacio de nombres.http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Extractos:
Diccionario <>
SortedDictionary <>
SortedList <>
Resumen provisional de los procedimientos subyacentes
Los comentarios son bienvenidos, ya que estoy seguro de que no hice todo bien.
n
.Diccionario
Memoria
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Añadir
HashArray(n) = Key.GetHash
# O (1)KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)Eliminar
For i = 0 to n
, encuentrai
dondeHashArray(i) = Key.GetHash
# O (log n) (matriz ordenada)HashArray(i)
# O (n) (matriz ordenada)KeyArray(i)
# O (1)ItemArray(i)
# O (1)Obtiene el objeto
For i = 0 to n
, encuentrai
dondeHashArray(i) = Key.GetHash
# O (log n) (matriz ordenada)ItemArray(i)
Bucle a través
For i = 0 to n
, regresoItemArray(i)
OrdenarDiccionario
Memoria
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Añadir
KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)For i = 0 to n
, encuentrai
dóndeKeyArray(i-1) < Key < KeyArray(i)
(usandoICompare
) # O (n)OrderArray(i) = n
# O (n) (matriz ordenada)Eliminar
For i = 0 to n
, encuentrai
dondeKeyArray(i).GetHash = Key.GetHash
# O (n)KeyArray(SortArray(i))
# O (n)ItemArray(SortArray(i))
# O (n)OrderArray(i)
# O (n) (matriz ordenada)Obtiene el objeto
For i = 0 to n
, encuentrai
dondeKeyArray(i).GetHash = Key.GetHash
# O (n)ItemArray(i)
Bucle a través
For i = 0 to n
, regresoItemArray(OrderArray(i))
SortedList
Memoria
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Añadir
For i = 0 to n
, encuentrai
dóndeKeyArray(i-1) < Key < KeyArray(i)
(usandoICompare
) # O (log n)KeyArray(i) = PointerToKey
# O (n)ItemArray(i) = PointerToItem
# O (n)Eliminar
For i = 0 to n
, encuentrai
dondeKeyArray(i).GetHash = Key.GetHash
# O (log n)KeyArray(i)
# O (n)ItemArray(i)
# O (n)Obtiene el objeto
For i = 0 to n
, encuentrai
dondeKeyArray(i).GetHash = Key.GetHash
# O (log n)ItemArray(i)
Bucle a través
For i = 0 to n
, regresoItemArray(i)
fuente
Intentando asignar una puntuación de desempeño a cada caso presentado por @Lev, utilicé los siguientes valores:
Los resultados son (más alto = mejor):
Por supuesto, cada caso de uso dará más peso a determinadas operaciones.
fuente