Quando você usaria um List <KeyValuePair <T1, T2 >> em vez de um Dictionary <T1, T2>?

95

Qual é a diferença entre uma Lista de KeyValuePair e um Dicionário para os mesmos tipos? Existe um momento apropriado para usar um ou outro?

Cadáver
fonte

Respostas:

80

Quando você não precisa de pesquisas rápidas na chave - manter a tabela de hash usada por Dictionarytem uma certa sobrecarga.

Pavel Minaev
fonte
9
Além disso, a operação de inserção de lista é mais rápida que a do Dicionário
Vadym Stetsiak
2
Seus campos são somente leitura, mas você sempre pode substituir o elemento inteiro na lista.
Pavel Minaev
Mais diferenças aqui
Vinni
62

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.

RCIX
fonte
7
+1 Observe que o dicionário também não impõe exclusividade do valor!
gdoron está apoiando Monica em
25

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:

  1. Você quer pesquisar itens concretos no dicionário?
  2. Você quer ter alguns campos não únicos (por exemplo, pares: nome / sobrenome).
Miroslav Holec
fonte
1
Acho que o ponto aqui é que as chaves de dicionário devem ser exclusivas, onde as chaves List <KeyValuePair> não devem ser exclusivas.
Bruno Bieri
5
As chaves <KeyValuePair> da Lista @BrunoBieri não podem ser exclusivas
Nikhil Vartak
2
Retifiquei seu comentário antigo de 2 anos e você percebeu isso. Não é à toa que o SO é a única plataforma de perguntas e respostas confiável e popular.
Nikhil Vartak
14

A lista também seria útil quando você se preocupasse com a ordem dos itens.

ninguém
fonte
2
SortedDictionary não cobriria isso?
Alex Angas
2
Sim, mas SortedDictionary não pode cobrir a ordem dos valores, apenas as chaves.
ConfusedMan
7

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.

daqui

tjmoore
fonte
5

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.

.

Phillip Ngan
fonte
3

De http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :

KeyValuePairvs. DictionaryEntry
[Krzysztof Cwalina]

Discutimos um problema com a implementação de IEnumerableem Dictionary<K,V>. Que tipo deve IEnumerable.GetEnumerator().Current retornar? KeyValuePair<K,V>ou DictionaryEntry? Mesmo para ICollection.CopyTo . Instâncias de que tipo devem ser copiadas para a matriz?

Decidimos o seguinte: IEnumerable e as ICollectionimplementações de interface usarão KeyValuePair<K,V>como tipo de item. IDictionarymembros específicos ( GetEnumeratorretornando IDictionaryEnumerator) usarão DictionaryEntrycomo tipo de item.

A razão é que estamos em um processo de fazer uma mudança para onde IEnumerator<T>estenderíamos IEnumerator. Seria muito estranho se percorrendo a hierarquia de Dictionary<K,V>-> IEnumerable<T>-> IEnumerable mudássemos repentinamente o tipo de item retornado dos enumeradores.

Um machado
fonte