¿Cuenta la propiedad contra el método Count ()?

Trabajando con una colección tengo las dos formas de obtener el recuento de objetos; Cuente (la propiedad) y Cuente () el método. Alguien sabe cuáles son las diferencias clave? Podría estar equivocado, pero siempre utilizo la propiedad Count en cualquier statement condicional porque asumo que el método Count () realiza algún tipo de consulta en la colección donde como Count ya debe haber sido asignado antes de que yo ‘get’. Pero eso es una suposición: no sé si el rendimiento se verá afectado si me equivoco.

EDITAR: por curiosidad, ¿contará Count () una excepción si la colección es nula? Porque estoy bastante seguro de que la propiedad Count simplemente devuelve 0.

Descomstackr la fuente para el método de extensión Count() revela que prueba si el objeto es una ICollection (genérica o no) y, de ser así, simplemente devuelve la propiedad Count subyacente:

Por lo tanto, si su código accede a Count lugar de llamar a Count() , puede omitir la comprobación de tipo, un beneficio de rendimiento teórico, pero dudo que sea notable.

 // System.Linq.Enumerable public static int Count(this IEnumerable source) { checked { if (source == null) { throw Error.ArgumentNull("source"); } ICollection collection = source as ICollection; if (collection != null) { return collection.Count; } ICollection collection2 = source as ICollection; if (collection2 != null) { return collection2.Count; } int num = 0; using (IEnumerator enumerator = source.GetEnumerator()) { while (enumerator.MoveNext()) { num++; } } return num; } } 

El rendimiento es solo una razón para elegir uno u otro. Elegir .Count () significa que su código será más genérico. He tenido ocasiones en las que rediseñé un código que ya no producía una colección, sino algo más genérico como un IEnumerable, pero como resultado se rompió otro código porque dependía de .Count y tuve que cambiarlo a .Count() . Si hice un punto para usar .Count() todas partes, el código probablemente sería más reutilizable y mantenible. Por lo general, optar por utilizar las interfaces más genéricas si puede salirse con la suya es su mejor opción. Por más genérico, me refiero a la interfaz más simple que es implementada por más tipos, y por lo tanto, se obtiene una mayor compatibilidad entre códigos.

No estoy diciendo .Count() es mejor, solo digo que hay otras consideraciones que se relacionan más con la reutilización del código que estás escribiendo.

El método .Count() podría ser lo suficientemente inteligente o conocer el tipo en cuestión y, de ser así, podría usar la propiedad subyacente .Count .

Entonces de nuevo, tal vez no.

Diría que es seguro asumir que si la colección tiene una propiedad .Count , esa será su mejor apuesta en lo que respecta al rendimiento.

Si el método .Count() no conoce la colección, la enumerará, que será una operación O (n).

El método Count () es un método de extensión que itera cada elemento de un IEnumerable <> y devuelve la cantidad de elementos que hay. Si la instancia de IEnumerable es en realidad una Lista <>, entonces está optimizada para devolver la propiedad Count en lugar de iterar todos los elementos.

Si hay una propiedad Count o Length, siempre debe preferir eso al método Count (), que generalmente itera toda la colección para contar el número de elementos dentro. (Las excepciones serían cuando el método Count () está en contra de un origen Linq to SQL o Linq to Entities, por ejemplo, en cuyo caso realizaría una consulta de conteo contra el origen de datos. Incluso entonces, si hay una propiedad Count, usted quiero preferir eso, ya que probablemente tenga menos trabajo que hacer).

El método Count () es el método LINQ que funciona en cualquier IEnumerable <>. Es de esperar que el método Count () itere en toda la colección para encontrar el recuento, pero creo que el código LINQ tiene algunas optimizaciones para detectar si existe una propiedad Count y, de ser así, usar eso.

Entonces ambos deberían hacer cosas casi idénticas. La propiedad Count es probablemente un poco mejor, ya que no es necesario que haya una verificación de tipo allí.

Versión corta: si tiene la opción entre una propiedad Count y un método Count() siempre elija la propiedad.

La diferencia se basa principalmente en la eficiencia de la operación. Todas las colecciones BCL que exponen una propiedad Count lo hacen de forma O (1). Sin embargo, el método Count() puede, y a menudo lo hará, costar O (N). Hay algunos controles para intentar obtener O (1) para algunas implementaciones, pero de ninguna manera está garantizado.

Count() está ahí como un método de extensión de LINQ – Count es una propiedad en List s, objetos de colección .NET reales.

Como tal, Count() casi siempre será más lento, ya que enumerará la colección / objeto consultable. En una lista, cola, stack, etc., use Count . O para una matriz – Length .