2012-01-01 15 views
5

Gracias por su ayuda para explicarme acerca de IList e IEnumerable. Marqué el question como respondí. Ahora tengo una solicitud de un poco más de información.Método de conteo o propiedad para un IList

que tienen código como este:

for (var index = 0; index < Model.Items.Count(); index++) 

Se sugirió en un post anterior que no es eficiente como el Conde() es un método y el fichero es ejecutado muchas veces. Intenté lo siguiente:

for (var index = 0; index < Model.Items.Count; index++) 

Esto parece funcionar.

¿Alguien puede confirmar que hay una diferencia. Ambos funcionan así que no estoy 100% seguro.

¿Sería el siguiente el más eficiente? ¿Necesita el foreach un IList o IEnumerable?

foreach(var item in Items) 
+0

Por favor, ponga un enlace a su pregunta anterior –

+0

añadido la cuestión prervious – rene

Respuesta

4

La llamada Count() método llama en realidad el método estático Enumerable.Count(). Esto está optimizado para las implementaciones IList para usar la propiedad, pero esto requiere una verificación de tipo dinámica, y aún termina yendo a la propiedad, por lo que usar la propiedad es ciertamente más eficiente. En .NET 3.5 solo optimiza para ICollection<T>, mientras que en .NET 4 optimiza también para el ICollection no genérico. Vea my Edulinq blog post on Count para más detalles.

En cuanto a la última parte de su pregunta: un bucle foreach puede o no puede ser más eficiente, pero sería más legible en mi opinión, que es bastante más importante. Definitivamente usaría foreach a menos que realmente necesite el índice de cada entrada.

+0

Gracias Jon. ¿El foreach requiere un IList o IEnumerable? –

+0

@ Samantha2: en realidad no requiere tampoco, estrictamente hablando, pero 'IEnumerable' (o' IEnumerable ') son suficientes para garantizar que pueda usar' foreach'. –

6

Count() método de extensión que funciona para todos los objetos que apoyan IEnumerable, y desde IEnumerable en sí no tiene ningún medio de informes de cuenta de artículos, que puede tener para iterar sobre IEnumerable ejemplo utilizando su IEnumerator, que puede ser un verdadero impacto en el rendimiento si es llamado muchas veces

Sin embargo, si nos fijamos en Count() aplicación, verá que está optimizado para ICollection tipos (tanto genéricos y no genéricos, por lo menos en FW4.0, lo que significa IList y IList<T> también están optimizados), y si su objeto implementa ICollection (que informa el recuento de elementos en la propiedad Count), el método Count() devuelve el recuento de elementos sin iterar a través de la recopilación. Es por eso que no ves la diferencia de rendimiento. Sin embargo, si sabe que tiene la instancia ICollection o IList, ¿por qué no obtener la propiedad Count directamente y ser independiente de la implementación del método Count()?

Además, recuerde que usted puede almacenar en caché el valor de retorno del método Count() en una variable para suprimir varias llamadas:

var count = Model.Items.Count(); 
for(var index = 0; index < count; index++) { } 
Cuestiones relacionadas