¿Por qué no hay una implementación genérica de OrderedDictionary en .net?

26

¿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

nonot1
fuente
2
Siempre hay SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
Travis Gockel
2
A menos que malinterprete los documentos de SortedDict, eso no es lo que quiero. No quiero hacer ninguna clasificación. Solo quiero una matriz a la que también pueda acceder por clave. De todos modos, realmente me pregunto por qué MS se saltó esto. (Problemas sutiles, etc.)
nonot1
¿Cuál es un caso de uso típico para un diccionario ordenado? Estoy luchando por pensar en uno fuera de mi cabeza.
Carson63000
1
@Carson cada vez que tenga lo que es una matriz de elementos de datos a los que también necesita acceso aleatorio rápido. Para simplemente almacenar en un Dict pierde la información de pedido, y el uso de una matriz requiere que mantenga su propio índice.
1 de
2
Pídale a Eric Lippert que lea y responda su pregunta. Por lo general, es muy agradable para ayudar con este tipo de preguntas. Creo que puede contactarlo a través de su blog: blogs.msdn.com/b/ericlippert
devuxer

Respuestas:

17

En C # 4.0 En resumen , leí esto:

  1. An OrderedDictionaryes una combinación de a HashTableyArrayList
  2. No hay genérico ArrayList
  3. "La ArrayListclase no genérica se utiliza principalmente para la compatibilidad con Framework 1.x ..."
  4. "An ArrayListes funcionalmente similar a List<object>"
  5. "La reflexión es más fácil con un no genérico ArrayListque con un List<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.

radarbob
fuente
44
Esto realmente no responde la pregunta. Un OrderedDictionary genérico obviamente podría construirse sobre un Diccionario genérico y una Lista genérica.
JacquesB
Un precepto del uso de la clase es si la interfaz de usuario no cambia a quién le importa la implementación. Bueno, el equipo de diseño / compilación del lenguaje, digamos, podría preferir que el genérico herede su contraparte no genérico . Mi sentido arácnido se aturde. Para empezar: ¿Son los antepasados ​​diferentes (inmediatos) una mina terrestre en algún lugar de la trayectoria evolutiva de OrderedDictionarycovarianza y contravarianza?
radarbob
15

Las OrderedDictionarysobrecargas de la operación de indexación para que la indexación con un entero Nva a conseguir el artículo en su posición N, mientras que la indexación con un Objectrecuperará el elemento que corresponde a dicha objeto. Si uno creara un elemento OrderedDictionary<int, string>llamado myDicty agregado (1, "George") y (0, "Fred") en ese orden, ¿debería myDict[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", y myDict.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 como Pointy Rectanglesignifica que, para myDict.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.

Super gato
fuente
3

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.

Telastyn
fuente
1
Tener una búsqueda más lenta a cambio de menos memoria solo hace que el OrderedDictionarya List. Me imagino que cualquier persona con un caso de uso legítimo para un OrderedDictionaryestá 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.
Abion47