En mi trabajo me tope con la necesidad de saber si una consulta devuelve registro a través de una lista para implementarla; a través de una condición yo determino si los trae. En esta época que los Frameworks nos proporcionan tantas formas de abstracción, con lo cual podemos hacer lo mismo de tantas formas diferentes me tope con estos dos métodos. Los cuales me permiten saber si una listas contienen elementos o trae elementos.
Dada una listas cualquiera veamos su funcionamiento:
List<string> _dias = new List<string>();
_dias.Add("lunes");
_dias.Add("martes");
_dias.Add("miércoles");
_dias.Add("jueves");
_dias.Add("viernes");
_dias.Add("sábado");
_dias.Add("domingo");
Con esta lista puedo comprobar la existencia de elementos dentro de ella de estas dos formas:
var contElemtCount = _dias.Count() > 0;
var contElemtAny = _dias.Any();
las dos formas me devolverán True si hay datos dentro de la lista, hasta aquí todo claro pero veamos cómo funciona cada una para decidir cual me conviene.
Primero como funciona el Count(), según el 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.”
Según entiendo; si vemos la interfaz ICollection dentro de ella hay una propiedad Count, y como es el caso de todas las colecciones del espacio de nombres de System.Collection.Generic, como vemos aquí.
ICollection<string> collection = _dias as ICollection<string>;
int Elementos = collection.Count;
Si se presenta una excepción esta no sabría de que lista estamos hablando y por lo tanto es mas rápida solo hay que hacer un casteo para saber el valor de Count. Pero que hacemos cuando la lista no implementa de esta interfaz.
En cambio Any(), nos 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 ElementosAny;
using (IEnumerator<string> enumerator = _dias.GetEnumerator())
{
ElementosAny = 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.