web-dev-qa-db-fra.com

Listes: Compte vs Compte ()

À partir d’une liste, quelle méthode est préférable pour déterminer le nombre d’éléments à l’intérieur?

var myList = new List<string>();

myList.Count
myList.Count()
95
Saxman

Count() est une méthode d'extension introduite par LINQ alors que la propriété Count fait partie de la liste elle-même (dérivée de ICollection). Cependant, LINQ vérifie en interne si votre IEnumerable implémente ICollection et, le cas échéant, utilise la propriété Count. Donc, en fin de journée, il n'y a aucune différence pour celle que vous utilisez pour un List.

Pour prouver mon argument, voici le code de Reflector pour Enumerable.Count()

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;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}
118
BFree

Préférez toujours les propriétés Count et Length d'un type à la méthode d'extension Count(). La première est un O(1) pour chaque type qui les contient. La méthode d’extension Count() dispose de quelques optimisations de vérification de type qui peuvent également être exécutées dans O(1) temps, mais se dégradera en O(N)= si la collection sous-jacente n’est pas l’un des rares types qu’elle connaît.

23
JaredPar

myList.Count est une méthode de l'objet liste, elle renvoie simplement la valeur d'un champ, elle est donc très rapide. Comme il s'agit d'une petite méthode, il est très probable que le compilateur (ou le moteur d'exécution) le mette en ligne, elles peuvent alors permettre une autre optimisation effectuée par le compilateur.

myList.Count () appelle une méthode d'extension (introduite par LINQ) qui parcourt tous les éléments d'un IEnumerabl, elle devrait donc être beaucoup plus lente.

Cependant (dans l’implémentation Microsoft), la méthode d’extension Count a un "cas spécial" pour les listes qui lui permet d’utiliser la propriété Count de la liste, ce qui signifie que la méthode Count () n’est que un peu plus lente que la propriété Count.

Il est peu probable que vous puissiez faire la différence de vitesse dans la plupart des applications.

Donc, si vous savez que vous avez affaire à une liste, utilisez la propriété Count, sinon, si vous avez un IEnumerabl "inconnu", utilisez la méthode Count () et laissez-la optimiser pour vous.

10
Ian Ringrose

Si par hasard vous voulez changer le type de votre collection, il vaut mieux utiliser l'extension Count(). De cette façon, vous n'avez pas besoin de refactoriser votre code (pour utiliser Length par exemple).

7
Simon Fischer