¿Por qué Microsoft no proporcionó la implementación genérica de OrderedDictionary?
He visto algunas implementaciones personalizadas, que incluyen: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx
Pero, ¿por qué Microsoft no lo incluyó en la biblioteca .net base? Seguramente tenían una razón para no construir un genérico ... pero ¿qué es?
Antes de publicar este mensaje, vi: /programming/2629027/no-generic-implementation-of-ordereddictionary
Pero eso solo confirma que no existe. No es por qué no existe.
Gracias
SortedDictionary<TKey, TValue>
: msdn.microsoft.com/en-us/library/f7fta44c.aspxRespuestas:
En C # 4.0 En resumen , leí esto:
OrderedDictionary
es una combinación de aHashTable
yArrayList
ArrayList
ArrayList
clase no genérica se utiliza principalmente para la compatibilidad con Framework 1.x ..."ArrayList
es funcionalmente similar aList<object>
"ArrayList
que con unList<object>
"¿Conclusión?
No genérico
OrderedDictionary
porque su construcción subyacente es una clase depreciada (no oficialmente) que no tiene una versión genérica en sí misma.fuente
OrderedDictionary
covarianza y contravarianza?Las
OrderedDictionary
sobrecargas de la operación de indexación para que la indexación con un enteroN
va a conseguir el artículo en su posiciónN
, mientras que la indexación con unObject
recuperará el elemento que corresponde a dicha objeto. Si uno creara un elementoOrderedDictionary<int, string>
llamadomyDict
y agregado (1, "George") y (0, "Fred") en ese orden, ¿deberíamyDict[0]
devolver "George" o "Fred"?Tal problema podría haberse resuelto imponiendo una restricción de clase en el tipo de clave. Por otro lado, gran parte de la utilidad de las colecciones genéricas proviene de su capacidad para trabajar eficientemente con tipos de valor. Imponer una restricción de clase en el tipo de clave parecería un poco feo.
Si la clase no tuviera que ser compatible con CLS, sino que simplemente tuviera que trabajar con vb.net, un diseño sensato podría haber sido utilizado con propiedades indexadas con nombre. Por lo tanto, en el ejemplo anterior,
myDict.ByKey[0]
habría dado "Fred", ymyDict.BySequence[0]
habría dado "George". Desafortunadamente, lenguajes como C # no admiten propiedades indexadas con nombre. Si bien uno podría haber ignorado algo para permitir el uso de la sintaxis anterior incluso sin tales propiedades, la desafortunada decisión de envolver los campos de estructuras comoPoint
yRectangle
significa que, paramyDict.ByKey[0] = "Wally"
trabajar,myDict.ByKey
tendría que devolver un nuevo objeto de clase. Una estructura sería más eficiente, pero los compiladores rechazarían lo que parecía ser una escritura en una estructura de solo lectura (a pesar de que la propiedad no modificaría la estructura devuelta porByKey
, pero modifica la colección a la que contiene una referencia).Personalmente, creo que sería bueno tener un objeto de diccionario que se especificara como seguimiento del orden de inserción; También me gustaría tener un objeto de diccionario que pueda devolver fácilmente la clave asociada a una clave particular (de modo que, por ejemplo, si uno tiene un diccionario que no distingue entre mayúsculas y minúsculas y ha agregado un registro con una clave de "GEORGE", uno podría preguntarle al diccionario qué clave está asociada con "George" sin tener que buscar a través de todos los
KeyValuePair
objetos devueltos en una enumeración.fuente
Debido a que mantener el orden evita la búsqueda O (1) que implica IDictionary a menos que se envuelvan dos colecciones (una por orden, otra por búsqueda), lo que hace que agregar / quitar sea menos eficaz y aumenta el uso de memoria. O podría tener una búsqueda más lenta en cambio por menos uso de memoria.
Supongo que no había una opción 'claramente mejor' aquí, por lo que no entró en la biblioteca estándar. Especialmente alrededor de 2.0, C # todavía estaba aprendiendo de los errores de Java. No me sorprendería que el enfoque de Java de 'todo y el fregadero de la cocina' a las colecciones en su biblioteca estándar fuera visto como algo que también debía evitarse.
fuente
OrderedDictionary
aList
. Me imagino que cualquier persona con un caso de uso legítimo para unOrderedDictionary
está usándolo específicamente porque necesita una clase de colección que tiene búsqueda O (1) pero también recuerda el orden de inserción, en cuyo caso el uso de memoria adicional es inevitable y, por lo tanto, aceptable.