-
La longueur est une propriété fixe, par exemple d'un tableau à une dimension ou d'une chaîne de caractères. Il n'y a donc jamais d'opération de comptage nécessaire (les tableaux multidimensionnels ont une taille de toutes les dimensions multipliées). L'opération O(1) signifie ici que le temps de récupération est toujours le même, quel que soit le nombre d'éléments. Une recherche linéaire serait (contrairement à cela) O(n).
-
La propriété Count sur les ICollections (List et List<T>, par exemple) peut changer, elle doit donc être mise à jour lors des opérations d'ajout/suppression, ou lorsque Count est demandé après que la Collection ait changé. Cela dépend de l'implémentation de l'objet.
-
La méthode Count() de LINQ itère en fait CHAQUE FOIS qu'elle est appelée (sauf lorsque l'objet est de type ICollection, auquel cas la propriété ICollection.Count est demandée).
Notez que les IEnumerables ne sont souvent pas des collections d'objets déjà définis (comme les listes, les tableaux, les hashtables, etc.), mais sont liés à des opérations en arrière-plan, qui génèrent des résultats dès qu'ils sont demandés (ce qu'on appelle l'exécution différée).
Typiquement, vous avez une déclaration SQL ou LINQ comme celle-ci (l'application typique de l'exécution différée) :
IEnumerable<Person> deptLeaders =
from p in persons
join d in departments
on p.ID equals d.LeaderID
orderby p.LastName, p.FirstName
select p;
Ensuite, il y a un code comme celui-ci :
if (deptLeaders.Count() > 0)
{
ReportNumberOfDeptLeaders(deptLeaders.Count());
if (deptLeaders.Count() > 20)
WarnTooManyDepartmentLeaders(deptLeaders.Count());
}
Ainsi, lorsqu'un avertissement concernant un trop grand nombre de chefs de service est émis, .NET parcourt QUATRE fois les personnes, les compare aux chefs de service, les trie par nom, puis compte les objets résultants.
Et ce, uniquement lorsque les personnes et les départements sont des collections de valeurs prédéfinies, et non des requêtes elles-mêmes.