Posterior a mirar en diversos repositorios y páginas de internet al final nos encontramos con la resolución que te mostramos aquí.
Solución:
IEnumerable
no admite esto. Esto es por diseño. IEnumerable
utiliza la evaluación perezosa para obtener los elementos que solicita justo antes de que los necesite.
Si desea saber la cantidad de elementos sin iterar sobre ellos, puede usar ICollection
tiene un Count
propiedad.
los System.Linq.Enumerable.Count
método de extensión en IEnumerable
tiene la siguiente implementación:
ICollection c = source as ICollection;
if (c != null)
return c.Count;
int result = 0;
using (IEnumerator enumerator = source.GetEnumerator())
while (enumerator.MoveNext())
result++;
return result;
Así que trata de lanzar a ICollection
que tiene un Count
propiedad, y utiliza eso si es posible. De lo contrario itera.
Así que lo mejor que puedes hacer es usar el Count()
método de extensión en su IEnumerable
objeto, ya que obtendrá el mejor rendimiento posible de esa manera.
Solo agregando algo de información adicional:
los Count()
la extensión no siempre itera. Considere Linq to Sql, donde el conteo va a la base de datos, pero en lugar de recuperar todas las filas, emite el Sql Count()
comando y devuelve ese resultado en su lugar.
Además, el compilador (o tiempo de ejecución) es lo suficientemente inteligente como para llamar a los objetos Count()
método si tiene uno. entonces es no como dicen otros respondedores, siendo completamente ignorante y siempre iterando para contar elementos.
En muchos casos donde el programador solo está comprobando if( enumerable.Count != 0 )
utilizando el Any()
método de extensión, como en if( enumerable.Any() )
es mucho más eficiente con la evaluación perezosa de linq, ya que puede provocar un cortocircuito una vez que puede determinar que hay elementos. También es más legible.
Acuérdate de que tienes el privilegio esclarecer si te ayudó.