Si tengo una lista de mensajes en una arquitectura de publicación/suscripción, supongo que es razonable usar IEnumerable.Where en una lista subyacente para recuperar mensajes particulares y confiar en el orden de los mensajes?¿El método de extensión LINQ está garantizado para conservar el orden?
Respuesta
El método de extensión Enumerable.Where
lo hará, pero el método de extensión Queryable.Where
no lo hará.
Enumerable.Where
tiene que conservar el orden, ya que transmite los resultados y no hay caché (y no hay lógica en los resultados de almacenamiento en caché).
Queryable.Where
, por otro lado, traduce la consulta dada a algo que el origen de datos subyacente entenderá y no hay ninguna garantía sobre el orden que nunca. Este efecto se puede observar fácilmente cuando se trabaja con bases de datos relacionales. La adición de una cláusula where
puede permitir que la base de datos elija otro índice, lo que puede cambiar el orden de los resultados.
De hecho, está documentado que LINQ to Entities * no * conserva el orden después de un '.Where()' –
Si bien es cierto que 'Enumerable.Where' actualmente conserva el orden, no veo nada en la documentación de la interfaz que garantice . Y, por supuesto, todas las apuestas están apagadas si estás usando 'ParallelEnumerable'. –
@Jim: acepto que la documentación de 'Enumerable.Where' no indica que se mantendrá el orden, pero creo que es seguro asumir que siempre conservará el orden, porque aún sería un cambio de comportamiento bastante grande que una gran cantidad de los desarrolladores dependen de. – Steven
Para Linq to Objects/IEnumerable
esto es cierto - se mantendrá el orden - para los proveedores de IQueryable
depende del proveedor, muchos proveedores no mantienen el orden.
Parece que este hecho (mantener el orden) no está documentado en MSDN, por lo que lo consideraría un detalle de implementación que, aunque poco probable, podría cambiar en el futuro.
¿Está documentada la interfaz para 'IEnumerable' para conservar el orden? ¿O simplemente "sabemos" que lo hará? –
@Jim, 'IEnumerable' no tiene' Where' en absoluto. Es un método de extensión y un patrón de consulta, pero no es miembro de la interfaz. –
@CraigStuntz: Bien. 'Enumerable.Where', entonces. No veo la documentación que dice que preservará el orden. –
- 1. ¿Está TCP garantizado para llegar en orden?
- 2. Conservar el orden de los valores con linq y ToLookup()
- 3. ¿Dónde está el Método de extensión LINQ "Fold"?
- 4. ¿El orden de inicialización está garantizado por la norma?
- 5. ¿El orden de un arraylist está garantizado en C# .NET?
- 6. ¿El orden de una matriz asociativa está garantizado en PHP?
- 7. LINQ y el método de extensión Count
- 8. orden de semáforo garantizado?
- 9. Método de extensión promedio en Linq para el valor predeterminado
- 10. Scala Group¿Para conservar el orden de inserción?
- 11. ¿Está garantizado el orden de clave de NSDictionary igual que el inicializado si nunca cambia?
- 12. ¿El pedido de elementos leídos de un XDocument, por LINQ, está garantizado?
- 13. ¿INSERT RETURNING está garantizado para devolver las cosas en el orden "correcto"?
- 14. ¿Está garantizado el orden de operaciones de izquierda a derecha en Java?
- 15. ¿Está garantizado el orden de los resultados provenientes de una lista de comprensión?
- 16. Conservar orden YAML perl
- 17. ¿Está garantizado el orden de un diccionario de Python en las iteraciones?
- 18. ¿Está garantizado que foreach iterará en el orden de matriz en php?
- 19. Ayuda del método de extensión LINQ II
- 20. Método de extensión LINQ to SQL para ordenar y paginar
- 21. ¿Dónde está el byte IBuffer []. Método de extensión AsBuffer?
- 22. Explícitamente use el método de extensión
- 23. Cómo conservar el orden de archivos en Ant concat?
- 24. Linq y el orden por
- 25. ¿Cómo se clasifica el método LINQ .distinct?
- 26. Spring Security: método no está garantizado con @PreAuthorize anotación
- 27. R - conservar el orden cuando se utilizan operadores coincidentes (% en%)
- 28. ¿Está garantizado el orden de las ENTRADAS en un POST para las entradas de matriz en PHP?
- 29. ¿El orden de iteración a través de std :: map es conocido (y está garantizado por el estándar)?
- 30. método de extensión linq para tomar elementos desde el extremo de la secuencia de
Tenga en cuenta que en realidad no existe ningún método como 'IEnumerable.Where'. Hay un método de extensión 'Enumerable.Where' que acepta un' IEnumerable '. ¡Pero es muy posible que una consulta LINQ determinada use algo diferente para un tipo enumerable dado! Y puede implementarse de una manera que preserve la orden o no la preserve. –
Sé que no es un miembro sino un método de extensión. Simplemente fue más fácil escribir y supongo que todo el mundo sabe sobre los métodos de extensión linq. – LinusK
Solo recuerde que un tipo enumerable determinado podría definir su propio método 'Where()', que podría usarse en lugar de 'Enumerable.Where()', según el tipo de la referencia que está enumerando. –