web-dev-qa-db-fra.com

Liste <T> Tout ou compter?

Quand je veux faire quelque chose avec une liste, je vérifie d'abord si ce n'est pas null ou ne contient aucun élément (pour ne pas souffler un foreach) et j'utilise habituellement list.Any() mais quelle est la meilleure option - utiliser list.Count > 0, ou utiliser list.Any()?

53
Dominating
  • Utilisez Count si vous utilisez un List, car il connaît sa taille.
  • Utilisez Length pour un Array
  • Si vous avez juste un IEnumerable j'utiliserais .Any() sur .Count() car ce sera plus rapide car il s'arrête après avoir vérifié un élément.

Consultez également cette question: Quelle méthode fonctionne mieux: .Any () vs .Count ()> 0?

79
Ray

J'utilise list.Count > 0 simplement parce qu'il ne dépend pas des méthodes LINQ et fonctionne donc sur C # 2.0.

Personnellement, j'évite LINQ comme la peste (en raison de sa vitesse lente), et il n'y a aucune raison d'utiliser des méthodes d'extension ici de toute façon.

Cependant, une meilleure solution serait probablement de faire votre propre version de Any qui prendrait un null référence, et retourne true s'il s'agit d'une collection avec des éléments. Cela vous éviterait le chèque nul.

4
Mehrdad

.Any() est généralement préférable à utiliser que .Count() > 0. La raison en est que si les éléments sur lesquels vous effectuez une itération ne sont pas un ICollection, il devra alors parcourir toute la liste pour obtenir le nombre.

Mais si les éléments sont un ICollection (qui est un List<T>), Il est tout aussi rapide ou dans certains cas plus rapide d'utiliser Count() (Any() itère une fois quel que soit le type sous-jacent dans MS .Net mais Mono essaie d'optimiser ceci à Count > 0 lorsque les éléments sous-jacents sont un ICollection)

Un excellent outil est Reflector , le code source .Net et le code source Mono qui vous permet de voir comment les choses sont implémentées.

4
Lasse Espeholt

Si vous utilisez Entity Framework et disposez d'une énorme table avec de nombreux enregistrements, Any () sera beaucoup plus rapide. Je me souviens d'une fois où j'ai voulu vérifier si une table était vide et qu'elle avait des millions de lignes. Il a fallu 20 à 30 secondes pour que Count ()> 0 se termine. C'était instantané avec Any ().

2
ashlar64

Any () peut être une amélioration des performances car il peut ne pas avoir à répéter la collection pour obtenir le nombre de choses. Il suffit de frapper l'un d'eux. Ou, pour, disons, LINQ-to-Entities, le SQL généré sera IF EXISTS (...) plutôt que SELECT COUNT ... ou même SELECT * ....

0
Janmejay Kumar