Prenons des cas simples:
.Where() est entièrement autonome sur l'élément en cours. Aucune autre donnée du flux ne lui est nécessaire pour savoir si oui ou non, un élément doit être filtré ou pas.
De même, Select, Disctinct, Any, etc, sont des méthodes "streamed".
Par opposition,
.Count() de toute évidence doit balayer l'intégralité du flux pour renvoyer son résultat.
C'est également vrai pour OrderBy, GroupBy, All, etc.
Il faut être conscient de l'impact de ces méthodes sur la performance.
Voici un exemple simple:
var q = from n in names where n.StartsWith("A") select n; foreach (var n in q) { //traitement } int count = q.Count();
Dans ce cas précis nous savons pertinemment que nous allons parcourir l'ensemble des éléments dans le foreach. Afin de ne pas parcourir l'énumération une seconde fois, il est préférable de:
- soit ajouter un compteur dans le foreach (count++).
- soit, de projeter l'ensemble des données dans un tableau si d'après votre contexte sa taille est raisonnable.
var q = from n in names where n.StartsWith("A") select n; var a = q.ToArray(); foreach (var n in a) { //traitement } int count = a.Lenght;