c# - elementat - ¿Cuándo utilizaría List<KeyValuePair<T1, T2>> en lugar de Dictionary<T1, T2>?
c# dictionary initialization (7)
¿Cuál es la diferencia entre una Lista de KeyValuePair y un Diccionario para los mismos tipos? ¿Hay un momento apropiado para usar uno u otro?
Además de la respuesta de Phillip Ngan, SOAP o no, no se pueden serializar objetos que implementen IDictionary.
P: ¿Por qué no puedo serializar hashtables?
A: XmlSerializer no puede procesar clases implementando la interfaz de 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.
De http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePair
vs.DictionaryEntry
[Krzysztof Cwalina]Discutimos un problema con la implementación de
IEnumerable
enDictionary<K,V>
. ¿Qué tipo debeIEnumerable.GetEnumerator().Current
¿RetornoIEnumerable.GetEnumerator().Current
?KeyValuePair<K,V>
oDictionaryEntry
? Lo mismo paraICollection.CopyTo
. ¿Instancias de qué tipo se deben copiar a la matriz?Decidimos lo siguiente: las implementaciones de interfaz
IEnumerable
eICollection
usaránKeyValuePair<K,V>
como tipo de elemento.IDictionary
miembros específicos deIDictionary
(GetEnumerator
devuelveIDictionaryEnumerator
) usaránDictionaryEntry
como el tipo de elemento.La razón es que estamos en un proceso de hacer un cambio donde
IEnumerator<T>
extenderíaIEnumerator
. Sería muy extraño si al caminar por la jerarquía delDictionary<K,V>
->IEnumerable<T>
->IEnumerable
cambiamos repentinamente el tipo del elemento devuelto por los enumeradores.
El diccionario es un tipo genérico que contiene una colección de pares clave-valor. El diccionario es rápido para las operaciones de búsqueda, porque está usando la función hash internamente . Eso significa que todas las claves deben ser únicas en el diccionario .
Considera 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:
- ¿Desea buscar elementos concretos en el diccionario?
- ¿Desea tener algunos campos no únicos (por ejemplo, pares: nombre / apellido).
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.
.
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.
La Lista también sería útil cuando le importe el orden de los artículos.
Cuando no necesita búsquedas rápidas en la clave, mantener la tabla hash utilizada por Dictionary
tiene una cierta sobrecarga.