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?

Respostas:


80

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


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.


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).

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


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


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.

.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.