¿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?¿Cuándo utilizaría List <KeyValuePair <T1, T2>> en lugar de Dictionary <T1, T2>?
Respuesta
Cuando no necesita búsquedas rápidas en la clave, mantener la tabla hash utilizada por Dictionary
tiene una cierta sobrecarga.
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.
+1 ¡Tenga en cuenta que el diccionario no impone la exclusividad del valor tampoco! – gdoron
De http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx:
KeyValuePair
vsDictionaryEntry
[Krzysztof Cwalina]Hemos discutido un problema con implementación de
IEnumerable
enDictionary<K,V>
. ¿Qué tipo debeIEnumerable.GetEnumerator().Current
devolver?KeyValuePair<K,V>
oDictionaryEntry
? Lo mismo paraICollection.CopyTo
. Las instancias de qué tipo se deben copiar a la matriz?decidimos lo siguiente:
IEnumerable
yICollection
interfaz implementaciones utilizaránKeyValuePair<K,V>
como el tipo de elemento.IDictionary
miembros específicos (GetEnumerator
regresanIDictionaryEnumerator
) 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íaIEnumerator
. Sería muy extraño si caminar la jerarquía deDictionary<K,V>
->IEnumerable<T>
->IEnumerable
de repente cambió el tipo del elemento regresar de enumeradores.
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.
.
La lista también sería útil cuando se preocupe por el orden de los artículos.
¿No [SortedDictionary] (https://msdn.microsoft.com/en-us/library/f7fta44c.aspx) cubre esto? –
Sí, pero SortedDictionary no puede cubrir el orden de los valores, solo las claves. – ConfusedMan
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.
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:
- ¿Quieres buscar artículos de hormigón en el diccionario?
- ¿Desea tener algunos campos no únicos (por ejemplo pares: nombre/apellido).
Creo que el punto aquí es que las claves del diccionario deben ser únicas donde las claves List
@BrunoBieri List
@niksofteng tiene toda la razón. Mi error. –
- 1. Conversión entre Tuple <T1,T2> y KeyValuePair <T1, T2>
- 2. ¿Cómo se implementa Tuple <T1,T2>. Crear <T1,T2> (T1 item1, T2 item2)?
- 3. no puede convertir List <KeyValuePair <...,...>> IEnumerable a <object>?
- 4. qué colección de C# usar en lugar de List <KeyValuePair <string, double >>?
- 5. Seleccione un diccionario <T1, T2> con LINQ
- 6. Convertir diccionario a List <KeyValuePair>
- 7. SortedList <>, SortedDictionary <> y Dictionary <>
- 8. LINQ - Creación de Expresión <T1> de Expresión <T2>
- 9. Delegado para una acción < ref T1, T2>
- 10. C#: ¿Cómo puede Dictionary <K,V> implementar ICollection <KeyValuePair <K,V>> sin tener Add (KeyValuePair <K,V>)?
- 11. ObservableCollection <> vs. List <>
- 12. Cómo usar List <T> o Dictionary <T,T2> en C# WinRT componente
- 13. Buscando un alterantive a la lista <KeyValuePair <cadena, KeyValuePair <cadena, cadena >>>
- 14. ¿Cómo se diferencia un multimap STL de .NET Dictionary <key, List <values>>?
- 15. Diccionario <StudentType, List <Student>> to IDictionary <StudentType, IList <Student>>?
- 16. C# Convert List <string> a Dictionary <string, string>
- 17. ¿Por qué el Diccionario <TKey, TValue> no tiene un IEnumerable <KeyValuePair <TKey, TValue >> ctor?
- 18. SkipList <T> vs Dictionary <TKey,TValue>
- 19. Rhino Mocks: ¿Puedo usar Stub() cuando uno de mis parámetros es Expression <Func<T1, T2>>?
- 20. ¿Existe una manera más fácil de inicializar una lista <KeyValuePair <T, U>>, como un Dictionary <T, U>?
- 21. Recreando un diccionario de un IEnumerable <KeyValuePair <>>
- 22. Queue <T> vs List <T>
- 23. Lista <? extiende Base> VS List <Base>
- 24. parámetro de acción en el que <T1, T2, T3> T3 puede ser opcional
- 25. return Queryable <T> o List <T> en un Repository <T>
- 26. convertir un IOrderedEnumerable <KeyValuePair <string, int>> en un diccionario <string, int>
- 27. Cómo convertir Dictionary <string, object> a Dictionary <string, string> en C#
- 28. List <> propia comparador
- 29. En MVC, ¿cuándo usa <%= %> y <% %>?
- 30. public List <(Of <(<'T>)>)> .. :: .. Enumerator?
También la operación de inserción de lista es más rápida que la del diccionario –
¿KeyValuePair no es de solo lectura? –
Sus campos son de solo lectura, pero siempre puede reemplazar todo el elemento en la lista. –