¿Contar los elementos de un IEnumerable<T> sin iterar?

Resuelto sebagomez asked hace 16 años • 22 respuestas
private IEnumerable<string> Tables
{
    get
    {
        yield return "Foo";
        yield return "Bar";
    }
}

Digamos que quiero iterar sobre ellos y escribir algo como procesar #n de #m.

¿Hay alguna manera de averiguar el valor de m sin iterar antes de mi iteración principal?

Espero haber sido claro.

sebagomez avatar Oct 04 '08 04:10 sebagomez
Aceptado

IEnumerableno soporta esto. Esto es por diseño. IEnumerableutiliza una evaluación diferida 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<T>, tiene una Countpropiedad.

Mendelt avatar Oct 03 '2008 21:10 Mendelt

El System.Linq.Enumerable.Countmétodo de extensión IEnumerable<T>tiene la siguiente implementación:

ICollection<T> c = source as ICollection<TSource>;
if (c != null)
    return c.Count;

int result = 0;
using (IEnumerator<T> enumerator = source.GetEnumerator())
{
    while (enumerator.MoveNext())
        result++;
}
return result;

Entonces intenta transmitir a ICollection<T>, que tiene una Countpropiedad, y la usa si es posible. De lo contrario, se repite.

Entonces, lo mejor que puede hacer es utilizar el Count()método de extensión en su IEnumerable<T>objeto, ya que de esa manera obtendrá el mejor rendimiento posible.

Daniel Earwicker avatar May 12 '2009 15:05 Daniel Earwicker