query - linq c# tutorial español
La mejor forma de obtener un recuento de IEnumerable<T> (10)
En cualquier caso, tienes que recorrerlo. Linq ofrece el método Count
:
var result = myenum.Count();
¿Cuál es la mejor / más fácil forma de obtener un recuento de elementos dentro de una colección IEnumerable sin enumerar todos los elementos de la colección?
Posible con LINQ o Lambda?
La solución depende de por qué no desea enumerar a través de la colección.
Si es porque enumerar la colección puede ser lento, entonces no hay 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 la enumeración 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)
15)
2 (5)
3 (5)
4 (5)
Si es porque la enumeración tiene efectos secundarios (por ejemplo, escribe en el disco / consola) o depende de variables que pueden cambiar entre recuento y enumeración (p. Ej., Lecturas del disco) [NB Si es posible, sugeriría reconsiderar la arquitectura ya que esto puede causar muchos problemas] entonces una posibilidad de considerar es leer la enumeración en un almacenamiento intermitente. Por ejemplo:
List<int> seriesAsList = Series.Generate(5).ToList();
Todo lo anterior supone que no puede cambiar el tipo (es decir, se devuelve de una biblioteca que no le pertenece). 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.
No es posible con LINQ, ya que llamar .Count (...) enumera la colección. Si te encuentras con el problema donde no puedes iterar a través de una colección dos veces, intenta esto:
List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;
foreach (MyTableItem in myList)
{
...
}
También hay IList o ICollection, si desea utilizar un constructo que todavía es algo flexible, pero también tiene la función que necesita. Ambos implican IEnumerable.
Si necesita contar y luego repetir, es posible que esté mejor con una lista.
Si usa el recuento para verificar miembros, puede usar Any()
para evitar enumerar toda la colección.
La mejor solución, como creo, es hacer lo siguiente:
- utilizando System.Linq.Dynamic;
- myEnumerable.AsQueryable (). Count ()
También depende de lo que quieras lograr contando ... Si estás interesado en encontrar si la colección enumerable tiene algún elemento, podrías usar
myEnumerable.Any () sobre myEnumerable.Count () donde el primero arrojará el primer elemento y el último arrojará todos los elementos.
Utilizar esta.
IEnumerable list =..........;
list.OfType<T>().Count()
devolverá el conteo.
Un IEnumerable tendrá que iterar a través de 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 ();
Tendrá que enumerar para obtener un conteo. Otros constructos como la Lista mantienen un recuento de ejecución.