2011-06-23 8 views
7
List<string> list = new List<string>() {"a", "b", "c"}; 
IEnumerable<string> enumerable = list; 

int c1 = list.Count; 
int c2 = list.Count(); 
int c3 = enumerable.Count(); 

diferencias en el rendimiento y la aplicación entre estos últimos 3 afirmaciones? ¿Ocurrirá list.Count() peor o lo mismo que list.Count, y qué importa si la referencia es del tipo IEnumerable<string>?no ¿Hay alguna diferencia entre el conde() (extensión LINQ) y Lista <T> .Count

Respuesta

10

Veamos con reflector:

public static int Count<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    ICollection<TSource> is2 = source as ICollection<TSource>; 
    if (is2 != null) 
    { 
     return is2.Count; 
    } 
    ICollection is3 = source as ICollection; 
    if (is3 != null) 
    { 
     return is3.Count; 
    } 
    int num = 0; 
    using (IEnumerator<TSource> enumerator = source.GetEnumerator()) 
    { 
     while (enumerator.MoveNext()) 
     { 
      num++; 
     } 
    } 
    return num; 
} 

tanto, si su IEnumerable<T> implementa ICollection<T> o ICollection, devolverá la propiedad Count.

0

Supongo que funciona así: una lista mantiene su propio recuento en una variable. Count() recorre el IEnumerable para contar la cantidad de elementos. Eso haría que List.Count sea más eficiente.

+0

Si IEnumerable es una colección IC (como una Lista), por lo tanto, tiene la propiedad .Count, entonces Linq utiliza esto como un acceso directo cuando utiliza el método .Count(). Esto significa que cualquiera que uses realmente no importa. – Dolbz

+0

Esto está mal. Count() está codificado para que solo se repita para contar si el elemento al que está llamando Count() no implementa ICollection. –

3

El método de recuento de Linq es lo suficientemente inteligente como para no iterar sobre la colección subyacente si implementa la interfaz ICollection y, por lo tanto, ya tiene la propiedad Count.

1

La implementación del recuento en IEnumerable primero comprueba si la lista enumerable también implementa ICollection<T> donde T es el parámetro genérico de la lista enumerable.

Si lo hace, devuelve ICollection<T>.Count.

Si no, comprueba si implementa ICollection. Si lo hace, devuelve ICollection.Count.

Si no implementa ninguna de ellas, tiene que iterar a través de toda la lista y contar, y esto podría ser una operación costosa para una lista grande.

List<string> Sin embargo, implementa ICollection<string> y por lo tanto, el rendimiento será el mismo.

Cuestiones relacionadas