¿Contar los elementos de un IEnumerable<T> sin iterar?
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.
IEnumerable
no soporta esto. Esto es por diseño. IEnumerable
utiliza 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 Count
propiedad.
El System.Linq.Enumerable.Count
mé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 Count
propiedad, 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.