2009-11-20 16 views

Respuesta

52

Cuando no necesita búsquedas rápidas en la clave, mantener la tabla hash utilizada por Dictionary tiene una cierta sobrecarga.

+6

También la operación de inserción de lista es más rápida que la del diccionario –

+0

¿KeyValuePair no es de solo lectura? –

+1

Sus campos son de solo lectura, pero siempre puede reemplazar todo el elemento en la lista. –

46

En resumen, la lista no impone la singularidad de la clave, por lo que si necesita esa semántica, entonces eso es lo que debe usar.

+4

+1 ¡Tenga en cuenta que el diccionario no impone la exclusividad del valor tampoco! – gdoron

3

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

KeyValuePair vs DictionaryEntry
[Krzysztof Cwalina]

Hemos discutido un problema con implementación de IEnumerable en Dictionary<K,V>. ¿Qué tipo debe IEnumerable.GetEnumerator().Current devolver? KeyValuePair<K,V> o DictionaryEntry? Lo mismo para ICollection.CopyTo. Las instancias de qué tipo se deben copiar a la matriz?

decidimos lo siguiente: IEnumerable y ICollection interfaz implementaciones utilizarán KeyValuePair<K,V> como el tipo de elemento. IDictionary miembros específicos (GetEnumerator regresan IDictionaryEnumerator) utilizará DictionaryEntry como el tipo de elemento.

La razón es que estamos en un proceso de hacer un cambio en IEnumerator<T> se extendería IEnumerator. Sería muy extraño si caminar la jerarquía de Dictionary<K,V> ->IEnumerable<T> ->IEnumerable de repente cambió el tipo del elemento regresar de enumeradores.

5

En los servicios web SOAP para silverlight, hemos encontrado que los diccionarios no se serializan. Esta sería una situación en la que usaría una Lista de KeyValuePair sobre un Diccionario.

.

11

La lista también sería útil cuando se preocupe por el orden de los artículos.

+2

¿No [SortedDictionary] (https://msdn.microsoft.com/en-us/library/f7fta44c.aspx) cubre esto? –

+2

Sí, pero SortedDictionary no puede cubrir el orden de los valores, solo las claves. – ConfusedMan

7

Además de la respuesta de Phillip Ngan, SOAP o de otro modo, no se puede serializar XML los objetos que implementa IDictionary.

P: ¿Por qué no puedo serializar hashtables?

A: El XmlSerializer no puede procesar las clases que implementan la interfaz IDictionary. Esto se debió en parte a restricciones de programación y en parte debido al hecho de que una tabla hash no tiene una contraparte en el sistema de tipo XSD. La única solución es implementar una tabla hash personalizada que no implemente la interfaz IDictionary.

from here

12

diccionario es genérico tipo que contiene una colección de pares de clave y valor. El diccionario es rápido para operaciones de búsqueda, porque es usando la función hash internamente. Eso significa que, , todas las claves deben ser únicas en el diccionario.

consideran este ejemplos:

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. 

por lo que debe considerar siempre dos al menos dos cosas:

  1. ¿Quieres buscar artículos de hormigón en el diccionario?
  2. ¿Desea tener algunos campos no únicos (por ejemplo pares: nombre/apellido).
+0

Creo que el punto aquí es que las claves del diccionario deben ser únicas donde las claves List no deben ser únicas. –

+0

@BrunoBieri List claves * puede * no ser único – niksofteng

+0

@niksofteng tiene toda la razón. Mi error. –

Cuestiones relacionadas