Encuentro eso SortedList<TKey, TValue> SortedDictionary<TKey, TValue>e Dictionary<TKey, TValue>implemento las mismas interfaces.
- ¿Cuándo debemos optar por una
SortedListySortedDictionaryotra vezDictionary? - ¿Cuál es la diferencia entre
SortedListySortedDictionaryen 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
SortedListusted puede recuperar por índice (en contraposición a la recuperación por clave) y enSortedDictionaryusted 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 elSortedanalógico, pero si se requiere el orden de los elementos, por ejemplo, para imprimirlos,Sortedse elige uno.Src: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html
fuente
Immutableversiones de estos diccionarios, lasSortedversiones 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
Collectionnecesitasorted, puede olvidarse deHashtableyDictionary: si llena su Colección de una sola vez -> vaya a SortedList, pero si anticipa que a menudo necesitará.Addy.Removeelementos -> vaya a SortedDictionary.sortedsignifica: cuando hace un enFor Each MyItem in Collectionlugar de ser procesado en el orden en que editó originalmente.Addlos elementos, asortedCollectionlos procesará en un orden de acuerdo con los criterios de losKeyvalores (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
Collectiontipos mencionados en la pregunta, sino que aborda todos los tipos delSystem.Collections.Genericespacio 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, encuentraidondeHashArray(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, encuentraidondeHashArray(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, encuentraidóndeKeyArray(i-1) < Key < KeyArray(i)(usandoICompare) # O (n)OrderArray(i) = n# O (n) (matriz ordenada)Eliminar
For i = 0 to n, encuentraidondeKeyArray(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, encuentraidondeKeyArray(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, encuentraidó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, encuentraidondeKeyArray(i).GetHash = Key.GetHash# O (log n)KeyArray(i)# O (n)ItemArray(i)# O (n)Obtiene el objeto
For i = 0 to n, encuentraidondeKeyArray(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