Méthode Count vs Count ()?

Travailler avec une collection, j’ai deux façons d’obtenir le nombre d’objects; Compter (la propriété) et compter () 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 () exécute une sorte de requête sur la collection où Count doit déjà avoir été atsortingbué avant que je «reçoive». Mais c’est une supposition – je ne sais pas si la performance sera affectée si je me trompe.

EDIT: Par curiosité, alors Count () lancera une exception si la collection est nulle? Parce que je suis sûr que la propriété Count renvoie simplement 0.

La décomposition de la source pour la méthode d’extension Count() révèle qu’elle vérifie si l’object est une ICollection (générique ou autre) et si oui, 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 de performance théorique mais je doute que cela soit perceptible!

 // 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; } } 

La performance n’est qu’une des raisons de choisir l’une ou l’autre. Choisir .Count () signifie que votre code sera plus générique. J’ai eu l’occasion de refactoriser du code qui ne produisait plus de collection, mais plutôt quelque chose de plus générique comme un IEnumerable, mais un autre code a été cassé parce qu’il dépendait de .Count et que je devais le remplacer par .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 sortir 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 qui vous permet une plus grande compatibilité entre les codes.

Je ne dis pas que .Count() est mieux, je dis juste qu’il y a d’autres considérations qui traitent plus de la réutilisabilité du code que vous écrivez.

La méthode .Count() peut être suffisamment intelligente ou connaître le type en question et, si tel est le cas, elle peut utiliser la propriété .Count sous-jacente.

Là encore, ça pourrait ne pas être le cas.

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 matière de performance.

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 renvoie le nombre d’éléments présents. Si l’instance de IEnumerable est en fait une liste <>, elle est optimisée pour renvoyer la propriété Count au lieu d’itérer tous les éléments.

S’il existe une propriété Count ou Length, vous devriez toujours préférer cette méthode à la méthode Count (), qui itère généralement toute la collection pour compter le nombre d’éléments à l’intérieur. (Par exemple, la méthode Count () est associée à une source Linq to SQL ou Linq to Entities. Dans ce cas, une requête count doit être exécutée sur la source de données. veux préférer cela, car il a probablement moins de travail à faire.)

La méthode Count () est la méthode LINQ qui fonctionne sur tout IEnumerable <>. Vous vous attendez à ce que la méthode Count () parcourt toute la collection pour trouver le compte, mais je pense que le code LINQ contient des optimisations pour détecter si une propriété Count existe et, le cas échéant, l’utiliser.

Ils devraient donc tous deux faire des choses presque identiques. La propriété Count est probablement un peu meilleure car il n’y a pas besoin de vérifier le type.

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 font de manière O (1). La méthode Count() peut cependant coûter et coûtera souvent O (N). Il y a des vérifications pour essayer de l’obtenir à O (1) pour certaines implémentations mais ce n’est en aucun cas garanti.

Count() existe car une méthode d’extension à partir de LINQ – Count est une propriété de List s, des objects de collection .NET réels.

En tant que tel, Count() sera presque toujours plus lent, car il énumérera l’object collection / interrogable. Sur une liste, queue, stack, etc., utilisez Count . Ou pour un tableau – Length .