A saída é 2,4,6,8
devido à execução adiada .
A consulta é realmente executada quando a variável de consulta é repetida, não quando a variável de consulta é criada. Isso é chamado de execução adiada.
- Suprotim Agarwal, "Execução de consulta adiada versus imediata no LINQ"
Há outra execução chamada Immediate Query Execution , que é útil para armazenar em cache os resultados da consulta. De Suprotim Agarwal novamente:
Para forçar a execução imediata de uma consulta que não produz um valor singleton, você pode chamar o método ToList(), ToDictionary(), ToArray(), Count(), Average()
ou Max()
em uma variável de consulta ou consulta. Eles são chamados de operadores de conversão que permitem que você faça uma cópia / captura instantânea do resultado e o acesso seja quantas vezes você desejar, sem a necessidade de executar novamente a consulta.
Se você deseja que a saída seja 2,4,6
, use .ToList()
:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}