¿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:
OrderedDictionaryes una combinación de aHashTableyArrayListArrayListArrayListclase no genérica se utiliza principalmente para la compatibilidad con Framework 1.x ..."ArrayListes funcionalmente similar aList<object>"ArrayListque con unList<object>"¿Conclusión?
No genérico
OrderedDictionaryporque su construcción subyacente es una clase depreciada (no oficialmente) que no tiene una versión genérica en sí misma.fuente
OrderedDictionarycovarianza y contravarianza?Las
OrderedDictionarysobrecargas de la operación de indexación para que la indexación con un enteroNva a conseguir el artículo en su posiciónN, mientras que la indexación con unObjectrecuperará el elemento que corresponde a dicha objeto. Si uno creara un elementoOrderedDictionary<int, string>llamadomyDicty 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 comoPointyRectanglesignifica que, paramyDict.ByKey[0] = "Wally"trabajar,myDict.ByKeytendrí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
KeyValuePairobjetos 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
OrderedDictionaryaList. Me imagino que cualquier persona con un caso de uso legítimo para unOrderedDictionaryestá 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.