Saltar al contenido

Contar los elementos de un IEnumerable sin iterar?

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 ICollectiontiene 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 ICollectionque 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ó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *