web-dev-qa-db-fra.com

Propriété Count vs méthode Count ()?

En travaillant avec une collection, j'ai les deux façons d'obtenir le nombre d'objets; Count (la propriété) et Count () la méthode. Quelqu'un sait quelles sont les principales différences? Je peux me tromper, mais j'utilise toujours la propriété Count dans toutes les instructions conditionnelles, car je suppose que la méthode Count () effectue une sorte de requête sur la collection où, en tant que Count, doit déjà avoir été assigné avant que j'obtienne. Mais c'est une supposition - je ne sais pas si les performances seront affectées si je me trompe.

EDIT: Par curiosité, Count () lèvera-t-il une exception si la collection est nulle? Parce que je suis presque sûr que la propriété Count renvoie simplement 0.

71
user1017882

La décompilation de la source de la méthode d'extension Count() révèle qu'elle teste si l'objet est un ICollection (générique ou autre) et si tel est le cas, renvoie simplement la propriété Count sous-jacente:

Donc, si votre code accède à Count au lieu d'appeler Count(), vous pouvez contourner la vérification de type - un avantage théorique sur les performances mais je doute que ce soit perceptible!

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

La performance n'est qu'une raison de choisir l'une ou l'autre. Choisir .Count () signifie que votre code sera plus générique. J'ai eu des occasions où j'ai refactorisé du code qui ne produisait plus de collection, mais à la place quelque chose de plus générique comme un IEnumerable, mais un autre code s'est cassé en conséquence parce qu'il dépendait de .Count Et j'ai dû le changer en .Count(). Si je tenais à utiliser .Count() partout, le code serait probablement plus réutilisable et maintenable. Habituellement, choisir d'utiliser les interfaces plus génériques si vous pouvez vous en tirer est votre meilleur pari. Par plus générique, je veux dire l'interface plus simple qui est implémentée par plus de types, et vous permettant ainsi une meilleure compatibilité entre le code.

Je ne dis pas que .Count() est mieux, je dis simplement qu'il y a d'autres considérations qui traitent davantage de la réutilisation du code que vous écrivez.

29
AaronLS

La méthode .Count()pourrait être suffisamment intelligente, ou connaître le type en question, et si oui, elle pourrait utiliser le sous-jacent .Count propriété.

Là encore, il se pourrait que non.

Je dirais qu'il est prudent de supposer que si la collection a une propriété .Count Elle-même, ce sera votre meilleur pari en termes de performances.

Si la méthode .Count() ne connaît pas la collection, elle l'énumérera, ce qui sera une opération O(n).

La méthode Count () est une méthode d'extension qui itère chaque élément d'un IEnumerable <> et retourne le nombre d'éléments. Si l'instance de IEnumerable est en fait un List <>, il est donc optimisé pour renvoyer la propriété Count au lieu d'itérer tous les éléments.

5
AntonioR

S'il existe une propriété Count ou Length, vous devez toujours la préférer à la méthode Count (), qui itère généralement la collection entière pour compter le nombre d'éléments qu'elle contient. (Les exceptions seraient lorsque la méthode Count () est par rapport à une source Linq to SQL ou Linq to Entities, par exemple, auquel cas elle effectuerait une requête count par rapport à la source de données. Même dans ce cas, s'il existe une propriété Count, vous devez veulent préférer cela, car il a probablement moins de travail à faire.)

3
Dave C

La méthode Count () est la méthode LINQ qui fonctionne sur n'importe quel IEnumerable <>. Vous vous attendriez à ce que la méthode Count () itère sur toute la collection pour trouver le nombre, mais je crois que le code LINQ contient en fait quelques optimisations pour détecter si une propriété Count existe et si oui, utilisez-la.

Ils devraient donc tous deux faire des choses presque identiques. La propriété Count est probablement légèrement meilleure car il n'y a pas besoin de vérifier le type.

2
Dylan Smith

Version courte: Si vous avez le choix entre une propriété Count et une méthode Count() choisissez toujours la propriété.

La différence concerne principalement l'efficacité de l'opération. Toutes les collections BCL qui exposent une propriété Count le font de façon O(1). La méthode Count() peut cependant coûter, et coûte souvent, O (N). Il y a quelques vérifications pour essayer de l'obtenir à O(1) pour certaines implémentations mais ce n'est en aucun cas garanti).

2
JaredPar

Count() existe comme méthode d'extension de LINQ - Count est une propriété sur Lists, des objets de collection .NET réels.

En tant que tel, Count() sera presque toujours plus lent, car il énumérera l'objet collection/interrogeable. Dans une liste, une file d'attente, une pile, etc., utilisez Count. Ou pour un tableau - Length.

1
Kieren Johnstone