El tema de la eficiencia se está volviendo importante, siempre lo ha sido, pero ahora más que nunca dado que los Frameworks nos brindan tantas abstracciones que podemos terminar haciendo lo mismo de una u otra forma sin preocuparnos por el que hace de fondo determinada función, y ese es el caso de estas dos sentencias. Dada una lista de la forma:
List<string> palabras = new List<string>(); palabras.Add("Primera"); palabras.Add("Segunda"); palabras.Add("Tercera");
Podemos entonces comprobar la existencia de elementos de las dos siguiente maneras:
bool contieneElementosCount = palabras.Count() > 0; bool contieneElementosAny = palabras.Any();
Ambas nos devolverán true o false según corresponda, pero lo harán de forma diferente, y aquí es donde debemos empezar a evaluar que no conviene más, por un lado tenemos la función Count() que si miramos la documentación oficial de MSDN veremos que dice claramente, “Si el tipo de source implementa ICollection<T>, esa implementación se utiliza para obtener el recuento de elementos. De lo contrario, este método determina el recuento.” Pero ¿qué quiere decir con esto? Pues simple, si vemos la interfaz ICollection podemos ver que una de sus propiedades es Count, es decir que acudir este método intentara hacer algo como lo siguiente:
ICollection<string> collection = palabras as ICollection<string>; int numeroElementos = collection.Count;
Cosa que para una colección que implementa de ICollection como lo hace List<T> no tiene ningún inconveniente, y como es el caso de todas las colecciones del espacio de nombres de System.Collection.Generic
pues todas implementan de la interfaz genérica ICollection. La excepción no sabría con que colección se presentaría y por lo tanto me parece la más rápida pues solo se debe hacer un casteo [de hecho ni se hace] para obtener el valor de count. El problema radica en que nos arriesgamos a tener una colección que no implemente de este y deba hacer el conteo manual [dentro de un while] y además de preguntar del lado de la linq por n > 0, haces un paso más y te arriesgas el doble.
Por el otro lado tenemos a Any(), este método determina si una secuencia contiene elementos. [*tomado de MSDN] de una forma un poco más directa, acudiendo directamente al método MoveNext de la enumeración pero sin tener que iterar sobre todos ellos, es decir, hará algo como lo siguiente:
bool contieneElementos; using (IEnumerator<string> enumerator = palabras.GetEnumerator()) { contieneElementos = enumerator.MoveNext(); }
Entonces como podemos ver Any() es un método especialmente diseñado para este propósito y no se debe confundir con una “variación” de Count(), pues su propósito no es ese, si no el de determinar la cantidad de elementos de una colección.
Espero les sea de utilidad.
Hasta el próximo post.






