¿Cuándo usaría un List <KeyValuePair <T1, T2 >> en lugar de un Dictionary <T1, T2>?

95

¿Cuál es la diferencia entre una lista de KeyValuePair y un diccionario para los mismos tipos? ¿Existe un momento adecuado para utilizar uno u otro?

Corpsekicker
fuente

Respuestas:

80

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

Pavel Minaev
fuente
9
También la operación de inserción de listas es más rápida que la del Diccionario
Vadym Stetsiak
2
Sus campos son de solo lectura, pero siempre puede reemplazar todo el elemento de la lista.
Pavel Minaev
Más diferencias aquí
Vinni
62

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

RCIX
fuente
7
+1 Tenga en cuenta que el diccionario tampoco impone la unicidad del valor.
gdoron apoya a Monica el
25

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

Considere estos 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 tanto, siempre debe considerar dos al menos dos cosas:

  1. ¿Quieres buscar elementos concretos en el diccionario?
  2. ¿Quieres que algunos campos no sean únicos (por ejemplo, pares: nombre / apellido)?
Miroslav Holec
fuente
1
Creo que el punto aquí es que las claves del diccionario deben ser únicas, mientras que las claves List <KeyValuePair> no deben ser únicas.
Bruno Bieri
5
@BrunoBieri List <KeyValuePair> Las claves pueden no ser únicas
Nikhil Vartak
2
Rectifiqué tu comentario de hace 2 años y lo notaste. No es de extrañar por qué SO es la única plataforma de preguntas y respuestas confiable y más popular.
Nikhil Vartak
14

La Lista también sería útil cuando le interese el orden de los artículos.

nadie
fuente
2
¿No cubriría esto SortedDictionary ?
Alex Angas
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 tipo, no puede serializar XML objetos que implementen IDictionary.

P: ¿Por qué no puedo serializar tablas hash?

R: XmlSerializer no puede procesar clases que implementan la interfaz IDictionary. Esto se debió en parte a restricciones de programación y en parte 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.

de aquí

tjmoore
fuente
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.

.

Phillip Ngan
fuente
3

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

KeyValuePaircontra DictionaryEntry
[Krzysztof Cwalina]

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

Decidimos lo siguiente: IEnumerable y las ICollectionimplementaciones de interfaz se utilizarán KeyValuePair<K,V>como tipo de elemento. IDictionarymiembros específicos (que GetEnumeratorregresan IDictionaryEnumerator) utilizarán DictionaryEntrycomo tipo de artículo.

La razón es que estamos en un proceso de hacer un cambio donde IEnumerator<T>extendería IEnumerator. Sería muy extraño si recorriendo la jerarquía desde Dictionary<K,V>-> IEnumerable<T>-> IEnumerable cambiamos repentinamente el tipo de elemento devuelto por los enumeradores.

Un hacha
fuente