Comment fonctionne l' instruction LINQ suivante ?
Voici mon code:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
Production: 2, 4, 6, 8
Pourquoi pas 2, 4, 6
?
Réponses:
La sortie est
2,4,6,8
due à une exécution différée .Il existe une autre exécution appelée Exécution immédiate des requêtes , qui est utile pour la mise en cache des résultats des requêtes. De Suprotim Agarwal à nouveau:
Si vous voulez que la sortie soit
2,4,6
, utilisez.ToList()
:la source
.First()
,.FirstOrDefault()
,.Single()
et.SingleOrDefault()
déclencher également l'évaluation de la requête.Cela s'est produit à cause d'une exécution différée, ce qui signifie que le calcul de l'expression n'est pas exécuté tant qu'il n'est pas nécessaire quelque part. Cela améliore les performances si les données sont trop volumineuses.
la source
La raison en est l'exécution différée de votre expression lambda. La requête est exécutée lorsque vous démarrez l'itération dans la boucle foreach.
la source
Lorsque vous utilisez un IEnumerable <> obtenu à partir de LINQ, seule une classe Enumerator est créée et l'itération ne démarre que lorsque vous l'utilisez dans une certaine marche.
la source
Vous obtenez ce résultat en raison d'une exécution différée, ce qui signifie que le résultat n'est en fait pas évalué avant son premier accès.
Pour le rendre plus clair, ajoutez simplement 10 à la liste à la fin de votre snipet, puis imprimez à nouveau, vous n'obtiendrez pas 10 en sortie
la source
10
dans la sortie.8
aucune sortie.