Eu acho isso SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
e Dictionary<TKey, TValue>
implemento as mesmas interfaces.
- Quando devemos optar por
SortedList
eSortedDictionary
terminarDictionary
? - Qual é a diferença entre
SortedList
eSortedDictionary
em termos de aplicação?
Respostas:
Ao iterar sobre os elementos em qualquer um dos dois, os elementos serão classificados. Não é assim com
Dictionary<T,V>
.MSDN trata da diferença entre
SortedList<T,V>
eSortedDictionary<T,V>
:fonte
SortedList
você pode recuperar por índice (em oposição à recuperação por chave) e emSortedDictionary
você não pode.Eu mencionaria diferença entre dicionários.
A imagem acima mostra que
Dictionary<K,V>
é igual ou mais rápido em todos os casos do queSorted
analógico, mas se a ordem dos elementos for necessária, por exemplo, para imprimi-los,Sorted
um é escolhido.Src: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html
fonte
Immutable
versões desses dicionários, asSorted
versões são geralmente mais rápidas em cerca de 40-50% do que as contrapartes não classificadas (aindaO(log(n))
, mas visivelmente mais rápidas por operação) . Os tempos podem ser diferentes dependendo de como a entrada está classificada. Consulte stackoverflow.com/a/30638592/111575Para resumir os resultados de um Teste de desempenho - SortedList x SortedDictionary x Dicionário x Hashtable , os resultados do melhor ao pior para diferentes cenários:
Uso de memória:
Inserções:
Operações de pesquisa:
operações de loop foreach
fonte
Collection
necessáriosorted
, você pode esquecerHashtable
eDictionary
: se preencher sua coleção de uma vez -> vá para SortedList, mas se você antecipar, muitas vezes precisará.Add
e.Remove
itens -> vá para SortedDictionary.sorted
significa: quando você faz um, emFor Each MyItem in Collection
vez de ser processado na ordem em que.Add
os itens foram originalmentesorted
Collection
editados , a irá processá-los em uma ordem de acordo com os critérios dosKey
valores (definidos em umIComparer
). Por exemplo, se suas Chaves são Strings, então sua Coleção será, por padrão, processada de acordo com a ordem alfabética de suas Chaves, mas você sempre pode definir uma regra de classificação personalizada.Quando você deseja que a coleção seja classificada por chave ao iterar sobre ela. Se você não precisa que seus dados sejam classificados, é melhor você apenas ter um Dicionário, ele terá um desempenho melhor.
SortedList e SortedDictionary fazem praticamente a mesma coisa, mas são implementados de forma diferente, portanto, têm diferentes pontos fortes e fracos explicados aqui .
fonte
Posso ver que as respostas propostas se concentram no desempenho. O artigo fornecido a seguir não fornece nada de novo em relação ao desempenho, mas explica os mecanismos subjacentes. Observe também que ele não se concentra nos três
Collection
Tipos mencionados na pergunta, mas aborda todos os Tipos doSystem.Collections.Generic
namespace.http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Extrai:
Dicionário <>
SortedDictionary <>
SortedList <>
Resumo provisório dos procedimentos subjacentes
O feedback é muito bem-vindo, pois tenho certeza de que não acertei tudo.
n
.Dicionário
Memória
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Adicionar
HashArray(n) = Key.GetHash
# O (1)KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)Remover
For i = 0 to n
, encontrei
ondeHashArray(i) = Key.GetHash
# O (log n) (matriz classificada)HashArray(i)
# O (n) (matriz classificada)KeyArray(i)
# O (1)ItemArray(i)
# O (1)Obter Item
For i = 0 to n
, encontrei
ondeHashArray(i) = Key.GetHash
# O (log n) (matriz classificada)ItemArray(i)
Loop Through
For i = 0 to n
, RetornaItemArray(i)
SortedDictionary
Memória
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Adicionar
KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)For i = 0 to n
, encontrei
ondeKeyArray(i-1) < Key < KeyArray(i)
(usandoICompare
) # O (n)OrderArray(i) = n
# O (n) (matriz classificada)Remover
For i = 0 to n
, encontrei
ondeKeyArray(i).GetHash = Key.GetHash
# O (n)KeyArray(SortArray(i))
# O (n)ItemArray(SortArray(i))
# O (n)OrderArray(i)
# O (n) (matriz classificada)Obter Item
For i = 0 to n
, encontrei
ondeKeyArray(i).GetHash = Key.GetHash
# O (n)ItemArray(i)
Loop Through
For i = 0 to n
, RetornaItemArray(OrderArray(i))
SortedList
Memória
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Adicionar
For i = 0 to n
, encontrei
ondeKeyArray(i-1) < Key < KeyArray(i)
(usandoICompare
) # O (log n)KeyArray(i) = PointerToKey
# O (n)ItemArray(i) = PointerToItem
# O (n)Remover
For i = 0 to n
, encontrei
ondeKeyArray(i).GetHash = Key.GetHash
# O (log n)KeyArray(i)
# O (n)ItemArray(i)
# O (n)Obter Item
For i = 0 to n
, encontrei
ondeKeyArray(i).GetHash = Key.GetHash
# O (log n)ItemArray(i)
Loop Through
For i = 0 to n
, RetornaItemArray(i)
fonte
Tentando atribuir um pontuação de desempenho a cada caso apresentado por @Lev, usei os seguintes valores:
Os resultados são (mais altos = melhores):
É claro que cada caso de uso dará mais peso a certas operações.
fonte