Tengo una pregunta sobre orden en IEnumerable
(o IEnumerable<T>
, no importa).IEnumerable y orden
Como sabemos, la iteración a través de IEnumerable es pseudo-código se puede escribir de la siguiente manera:
while (enumerable.HasNext())
{
object obj = enumerable.Current;
...
}
Ahora, supongamos que uno necesita para operar en un ordenados colección. ¿Se puede usar IEnumerable en este caso o es mejor probar otros medios (por ejemplo, IList
) con soporte de indexación?
En otras palabras: ¿el contrato de IEnumerable
hace alguna garantía sobre el pedido en general?
UPD: Por lo tanto, IEnumerable
no es el medio adecuado para una interfaz genérica que garantiza el pedido. La nueva pregunta es ¿qué interfaz o clase se debe usar para una colección inmutable con el pedido? ReadonlyCollection
? IList
? Ambos contienen el método Add()
(incluso no está implementado en el anterior). ¿Alguna sugerencia?
P.S Mis propios pensamientos: IEnumerable
no ofrece ninguna garantía sobre el pedido. La implementación correcta podría devolver los mismos elementos en orden diferente en diferentes enumeraciones (considere una consulta SQL)
P.P.S. Soy consciente de LINQ First()
, pero si IEnumerable
no dice una palabra sobre su orden, esta extensión es bastante inútil.
Otro ejemplo es 'Dictionary <,>'. Está claramente documentado que el orden en que se enumeran sus entradas no está definido. Así que el código como 'dict.Last(). Key' (donde' dict' es un 'Dictionary <,> 'y' Last() 'es el método de extensión LINQ) no tiene sentido. (He oído hablar de un desarrollador que está haciendo exactamente eso). –
Añadiría que ya dije que es importante entender correctamente qué garantías hay sobre el pedido de una colección genérica. Por lo tanto, la garantía de pedido no se trata de un orden en particular (por ejemplo, como resultado de la clasificación), sino de garantizar que el orden de los elementos de la misma colección sea el mismo para las enumeraciones posteriores. La mayoría de las colecciones no garantizan explícitamente eso. IList solo representa un tipo de diccionario donde las claves son índices. –
IOrderedEnumerable puede ser un signo para creer que la colección garantiza el pedido (aunque la interfaz aún no lo hace), pero es más de lo que necesitamos; por lo general, representa un pedido SORT particular, mientras que NECESITAMOS CUALQUIER orden (aleatorio) que sea justo garantizado entre enumeraciones. Para concluir, solo la implementación concreta realmente puede garantizar el orden (por ejemplo, Matriz, Lista). –