¿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?
¿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?
Respuestas:
Cuando no necesita búsquedas rápidas en la clave, mantener la tabla hash utilizada por Dictionarytiene una cierta sobrecarga.
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.
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:
La Lista también sería útil cuando le interese el orden de los artículos.
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.
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.
.
De http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePaircontraDictionaryEntry
[Krzysztof Cwalina]Discutimos un problema con la implementación de
IEnumerableonDictionary<K,V>. ¿Qué tipo deberíaIEnumerable.GetEnumerator().Currentdevolver?KeyValuePair<K,V>oDictionaryEntry? Lo mismo paraICollection.CopyTo. ¿Las instancias de qué tipo deben copiarse en la matriz?Decidimos lo siguiente:
IEnumerabley lasICollectionimplementaciones de interfaz se utilizaránKeyValuePair<K,V>como tipo de elemento.IDictionarymiembros específicos (queGetEnumeratorregresanIDictionaryEnumerator) utilizaránDictionaryEntrycomo tipo de artículo.La razón es que estamos en un proceso de hacer un cambio donde
IEnumerator<T>extenderíaIEnumerator. Sería muy extraño si recorriendo la jerarquía desdeDictionary<K,V>->IEnumerable<T>->IEnumerablecambiamos repentinamente el tipo de elemento devuelto por los enumeradores.