Una pregunta sorprendente: encuentro que la intención de list.Any()
ser mucho más clara que la intención de list.Count()!=0
.
Intención significa: si lees el código de alguien (y no lo escribiste tú mismo), ¿es completamente obvio lo que el programador quiere lograr y por qué lo escribió escrito así? Si un problema común se resuelve de una manera innecesariamente compleja, inmediatamente sospecha y se pregunta por qué el desarrollador no usó la forma simple. Miras el código e intentas ver si te has perdido algo. Tiene miedo de cambiar el código porque le preocupa que haya algún efecto secundario que le falte y cambiarlo puede causar problemas inesperados.
La intención de usar el Any()
método es completamente clara: desea saber si hay elementos en la lista o no.
La intención de la expresión, Count()!=0
por otro lado, no es obvia para el lector. Por supuesto, no es difícil ver que la expresión te dice si la lista está vacía o no. Las preguntas surgen porque lo escribes de esta manera particular en lugar de usar el método estándar. ¿Por qué lo usas Count()
explícitamente? Si realmente sólo necesita saber si hay alguna elementos de una lista, ¿por qué desea contar toda la lista en primer lugar? Tan pronto como llegue a 1, ya tiene su respuesta. Si la fuente era un iterador sobre una colección grande (quizás infinita) o se traduce a sql, podría hacer una gran diferencia en cuanto al rendimiento. Entonces, ¿tal vez el uso explícito de Count () es forzar una consulta diferida para ejecutar o recorrer un iterador?
Pero la fuente es en realidad un lugar List<T>
donde Count()
está O (1) y no tiene efectos secundarios. Pero si el código se basa en esta propiedad de List<T>
, ¿por qué no utilizar la Count
propiedad -que indica más claramente que espera una operación O (1) sin efectos secundarios?
Como está escrito, list.Count()!=0
hace exactamente lo mismo, list.Any()
excepto que es innecesariamente más complejo y la intención no está clara.
Any()
es menos clara: meAny()
parece más clara, especialmente con una condición lambda. Traducir el código al inglés en mi cabeza, seif(MyList.Count(o => o > 10) > 0)
convierte en "¿Es el número de elementos mayor que 10 más que 0?" mientras que seif(MyList.Any(o => o > 10))
convierte en "¿Hay algún elemento mayor que 10?"Any
esExists
. El nombre de Linq probablemente esté más inspirado en Haskell y Python, que también tienen alguna / todas las funciones.