Como funciona a seguinte instrução LINQ ?
Aqui está o meu código:
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);
}
Resultado: 2, 4, 6, 8
Por que não 2, 4, 6
?
Respostas:
A saída é
2,4,6,8
devido à execução adiada .Há outra execução chamada Immediate Query Execution , que é útil para armazenar em cache os resultados da consulta. De Suprotim Agarwal novamente:
Se você deseja que a saída seja
2,4,6
, use.ToList()
:fonte
.First()
,.FirstOrDefault()
,.Single()
e.SingleOrDefault()
também desencadear a avaliação da consulta.Isso aconteceu devido à execução adiada, o que significa que o cálculo da expressão não é executado até que seja necessário em algum lugar. Isso melhora o desempenho se os dados forem muito grandes.
fonte
A razão para isso é a execução adiada da sua expressão lambda. A consulta é executada quando você inicia a iteração no loop foreach.
fonte
Quando você usa um IEnumerable <> obtido do LINQ, apenas é criada uma classe Enumerator e a iteração é iniciada apenas quando você a usa em alguma caminhada.
fonte
Você está obtendo esse resultado devido à execução adiada, o que significa que o resultado não é avaliado até o primeiro acesso.
Para tornar mais claro, adicione 10 à lista no final do seu snipet e, em seguida, imprima novamente, você não obterá 10 na saída
fonte
10
na saída.8
em nenhuma saída.