2008-08-26 23 views
26

¿Cuál es la mejor/más fácil manera de obtener un recuento de elementos dentro de una colección IEnumerable sin enumerar todos los elementos de la colección?La mejor manera de obtener un recuento de IEnumerable <T>

Posible con LINQ o Lambda?

+1

posible duplicado de [Cómo: contar los elementos de un IEnumerable sin iterar?] (Http://stackoverflow.com/questions/168901/howto-count-the-items-from-a-ienumerablet-without-iterating) –

Respuesta

12

Deberá enumerar para obtener un conteo. Otros constructos como la Lista mantienen un recuento de ejecución.

+0

si la variable IEnumerable se pasó al método, entonces variable.Count() funcionó para mí. –

+0

@Vikram Por lo que yo sé, eso no puede ser cierto. ¿Estás seguro de que no estás eligiendo un lugar? – Sinjai

13

En cualquier caso, debe recorrerlo. LINQ ofrece la Count método:

var result = myenum.Count(); 
+1

Sí, esto funciona, siempre que tenga "using System.Linq;" al comienzo del archivo. Sin Linq, esto no funciona. – user1961169

0

No es posible con LINQ, como llamar .Count (...) no enumerar la colección. Si se encuentra con el problema donde no puede iterar a través de una colección dos veces, intente esto:

List<MyTableItem> myList = dataContext.MyTable.ToList(); 
int myTableCount = myList.Count; 

foreach (MyTableItem in myList) 
{ 
    ... 
} 
1

También hay IList o ICollection, si desea utilizar una construcción que todavía es algo flexible, pero también tiene la función que necesita. Ambos implican IEnumerable.

16

La solución depende de por qué no desea enumerar a través de la colección.

Si es porque la enumeración de la recopilación puede ser lenta, entonces no hay una solución que sea más rápida. Es posible que desee considerar el uso de una ICollection en su lugar si es posible. A menos que la enumeración sea notablemente lenta (por ejemplo, lee elementos del disco), la velocidad no debería ser un problema.

Si es porque la enumeración de la colección requerirá más código, entonces ya se ha escrito para usted en la forma del método de extensión .Count(). Simplemente use MyEnumerable.Count().

Si es porque quiere poder enumerar la colección después de haber contado, el método de extensión .Count() lo permite. Incluso puede llamar a .Count() en una colección que está en el medio de enumerar y continuará desde donde estaba antes del recuento. Por ejemplo:

foreach (int item in Series.Generate(5)) 
{ 
    Console.WriteLine(item + "(" + myEnumerable.Count() + ")"); 
} 

dará los resultados

0 (5)

1 (5)

2 (5)

3 (5)

4 (5)

Si es porque la enumeración tiene efectos secundarios (p. escribe en el disco/consola) o depende de las variables que pueden cambiar entre el recuento y la enumeración (por ejemplo, lecturas del disco) [N.B. Si es posible, sugeriría que se reconsidere la arquitectura ya que esto puede causar muchos problemas] entonces una posibilidad a considerar es leer la enumeración en un almacenamiento intermitente. Por ejemplo:

List<int> seriesAsList = Series.Generate(5).ToList(); 

Todo lo anterior asume que no se puede cambiar el tipo (es decir, se volvió de una biblioteca que usted no es dueño). Si es posible, puede considerar cambiar para usar un ICollection o IList (ICollection tiene un alcance más amplio que IList) que tiene una propiedad Count en él.

0

Si necesita contar y luego repetir, es posible que esté mejor con una lista.

Si está utilizando el recuento para verificar miembros, puede usar Any() para evitar enumerar toda la colección.

0

La mejor solución -como creo que es para hacer lo siguiente:

  1. usando System.Linq.Dynamic;
  2. myEnumerable.AsQueryable(). Count()
+4

Incorrecto. Eso no es mejor que cualquier otra cosa, y probablemente sea peor. – SLaks

1

También depende de lo que quiere lograr contando .. Si usted está interesado en saber si la colección numerable tiene ningún elemento, se puede usar

myEnumerable.Any() sobre myEnumerable.Count() donde el primero arrojará el primer elemento y el último arrojará todos los elementos.

5

Use esto.

IEnumerable list =..........; 

list.OfType<T>().Count() 

que devolverá el conteo.

+3

list.OfType () .Count() – Mukesh

1

Un IEnumerable tendrá que recorrer cada elemento. para obtener la cuenta completa. Si solo necesita verificar si hay uno o más elementos en un IEnumerable, un método más eficiente es verificar si hay alguno. Cualquiera() solo verifica para ver si hay un valor y no recorre todo.

IEnumerable myStrings = new List() {"one", "two", "three"};

bool hasValues ​​= myStrings.Any();

Cuestiones relacionadas