125 votes

Liste Comte vs Count()? Lequel et pourquoi?

J'ai une liste d'objet, c - List<string> myList { "Item1", "Item2", "Item3",... ... }, la méthode est préférable d'appeler pour le comptage des éléments à l'intérieur, et pourquoi? var count = myList.Count; ou var count myList.Count(); ?

Merci.

139voto

BFree Points 46421

Count() est une extension de la méthode introduite par LINQ tandis que l' Count propriété fait partie de la Liste elle-même (dérivé de l' ICollection). En interne cependant, LINQ vérifie si votre IEnumerable implémente ICollection et si elle ne l'utilise l' Count de la propriété. Ainsi, à la fin de la journée, il n'y a pas de différence de celui que vous utilisez pour un List.

Pour prouver mon point plus loin, voici le code à partir de Réflecteur 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;
}

34voto

JaredPar Points 333733

Toujours préférer Count et Length des propriétés sur un type de plus de la méthode d'extension Count(). Le premier est un O(1) pour chaque type qui les contient. L' Count() extension en partie de la méthode de vérification de type optimisations qui peuvent entraîner à terme aussi en O(1) le temps mais va se dégrader à O(N) si la collection sous-jacente n'est pas l'un des rares types il connaît.

11voto

Ian Ringrose Points 19115

myList.Le comte est une méthode de l'objet de la liste, elle retourne la valeur d'un champ est donc très rapide.

myList.Count() est l'appel d'une méthode d'extension (introduit par LINQ) qui passe en boucle sur tous les éléments dans un IEnumerabl, devrait donc être beaucoup plus lent.

Cependant, Dans la mise en œuvre de Microsoft), le Comte de la méthode d'extension a un "cas spécial" pour les Listes qui lui permet d'utiliser la liste de propriété de compte, cela signifie que la méthode Count() est seulement un peu plus lent que la propriété Count. Dans peu probable que vous serez en mesure de faire la différence dans la vitesse, dans la plupart des applications.

Donc, si vous savez que vous avez affaire avec une Liste, on utilise la propriété Count, sinon, si vous avez un "inconnu" IEnumerabl, utilisez la méthode Count() et de le laisser optimiser pour vous.

7voto

Simon Fischer Points 1597

Si vous, par hasard, veut changer le type de votre collection vous êtes mieux servi avec de la Count() extension. De cette façon, vous n'avez pas à restructurer le code (pour utiliser Length par exemple).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X