Contexto típico: hago un método de extensión para una colección que considera que los elementos están ordenados. La función comienza al principio, en el índice 0, y el orden tiene importancia. Ejemplos: Agrupación por secuencia o índices de un elemento .
Sin embargo, siempre estoy perplejo en cuanto a qué extender: IEnumerable<T>
o T[]
. Mi razonamiento fue la claridad del propósito: una matriz tiene una noción de orden, mientras que un IEnumerable es implementado por muchas colecciones genéricas, no todas las cuales tienen una noción de orden:
- Diccionario - sin ordenar
- HashSet - sin ordenar
- LinkedList - ordenado
- Lista - ordenada
- Cola - ordenada
- SortedDictionary - ordenado (no orden original)
- SortedList - ordenado (no orden original)
- SortedSet - ordenado (orden no original)
- Pila - invertida
Así como cualquier otra implementación que pueda o no ordenarse.
Además, no estoy seguro de si el enumerador se restablece si no se completa una enumeración, así que si eso es una preocupación, ¿quién sabe en qué punto comenzaría la enumeración? Enumerar una matriz siempre comenzaría desde el principio.
Entonces, para mí, tiene más sentido extender a T[]
. ¿Pero estoy en lo cierto al pensar eso? ¿Me estoy preocupando demasiado? ¿Cuál es el enfoque adecuado para garantizar la enumeración "ordenada"?
Dictionary
? Probablemente no. Como dijo Scott Meyers: "La mejor manera de evitar el uso incorrecto es hacer que dicho uso sea imposible". . ¿Es posible / sería beneficioso hacerlo en este escenario?Creo que desea combinar 2 conceptos diferentes en 1. La estructura de datos y su orden de contenido son 2 cosas separadas.
Ordenar es un tema complicado. Por ejemplo, ¿qué significa ordenar una lista de personas? Incluso cuando se define la clave de orden / clasificación, debe tener una dirección y debe decidir qué hacer con los valores nulos (si los hay), problemas de fecha, etc.
Si el pedido de datos es importante para su método, entonces puede ser su método el responsable de ordenar los datos como parte de su configuración en lugar de solicitar que la persona que llama solicite los datos. Algunos algoritmos de coincidencia de cadenas utilizan un enfoque similar en el que se construye un diccionario dentro del método de búsqueda a partir de la cadena aprobada antes de buscar la cadena. Sé que este no es el caso exacto, pero es el ejemplo más cercano que se me ocurre.
fuente
IEnumerable declara que la colección que tiene se puede enumerar; No implica nada sobre el contenido. Esto no es algo malo: los contenedores pueden tener capacidades y restricciones adicionales además de las interfaces individuales.
(No veo cómo una matriz es mejor aquí: es indexable, al igual que una IList y otros contenedores, pero no hay nada en la indexación que implique el orden de los datos. Su lista es un poco extraña: algunos elementos están "ordenados "en el sentido de que conservan el orden de inserción, otros están" ordenados "tal como están ordenados. Son dos cosas diferentes. Aparte de SortedSet / SortedList / SortedDictionary, no debe suponer que los datos están en un orden particular a menos que maneje eso dentro de su propio código.)
Sin embargo, IEnumerable proporciona una extensión LINQ que le permite .OrderBy, por lo que cualquier cosa que sea enumerable se puede devolver en un orden ordenado IOrderedEnumerable. Sin embargo, esa es una interfaz específica de LINQ (y no está implementada de manera predeterminada por SortedSet / SortedList / SortedDictionary, por lo que podría no tener sentido extender esa interfaz en particular ...)
fuente