Respostas:
Quando você não precisa de pesquisas rápidas na chave - manter a tabela de hash usada por Dictionary
tem uma certa sobrecarga.
Resumindo, a lista não impõe exclusividade da chave, então se você precisa dessa semântica, então é o que você deve usar.
Dicionário é um tipo genérico que contém uma coleção de pares de valores-chave. O dicionário é rápido para operações de pesquisa, porque usa a função hash internamente . Isso significa que todas as chaves devem ser exclusivas no dicionário .
Considere estes exemplos:
List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.
Portanto, você deve sempre considerar duas, pelo menos, duas coisas:
A lista também seria útil quando você se preocupasse com a ordem dos itens.
Na sequência da resposta de Phillip Ngan, SOAP ou outro, você não pode serializar XML objetos que implementam IDictionary.
P: Por que não consigo serializar hashtables?
R: O XmlSerializer não pode processar classes que implementam a interface IDictionary. Isso se deveu em parte a restrições de cronograma e em parte ao fato de que uma tabela de hash não tem uma contrapartida no sistema de tipo XSD. A única solução é implementar uma hashtable customizada que não implemente a interface IDictionary.
Em serviços da web SOAP para silverlight, descobrimos que os dicionários não serializam. Esta seria uma situação em que você usaria uma Lista de KeyValuePair sobre um Dicionário.
.
De http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePair
vs.DictionaryEntry
[Krzysztof Cwalina]Discutimos um problema com a implementação de
IEnumerable
emDictionary<K,V>
. Que tipo deveIEnumerable.GetEnumerator().Current
retornar?KeyValuePair<K,V>
ouDictionaryEntry
? Mesmo paraICollection.CopyTo
. Instâncias de que tipo devem ser copiadas para a matriz?Decidimos o seguinte:
IEnumerable
e asICollection
implementações de interface usarãoKeyValuePair<K,V>
como tipo de item.IDictionary
membros específicos (GetEnumerator
retornandoIDictionaryEnumerator
) usarãoDictionaryEntry
como tipo de item.A razão é que estamos em um processo de fazer uma mudança para onde
IEnumerator<T>
estenderíamosIEnumerator
. Seria muito estranho se percorrendo a hierarquia deDictionary<K,V>
->IEnumerable<T>
->IEnumerable
mudássemos repentinamente o tipo de item retornado dos enumeradores.