As consultas LINQ são preguiçosas . Isso significa o código:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
faz muito pouco. O enumerável original ( mythings
) só é enumerado quando o enumerável resultante ( things
) é consumido, por exemplo, por um foreach
loop .ToList()
, ou .ToArray()
.
Se você ligar things.ToList()
, é aproximadamente equivalente ao seu último código, talvez com alguma sobrecarga (geralmente insignificante) dos enumeradores.
Da mesma forma, se você usar um loop foreach:
foreach (var t in things)
DoSomething(t);
É semelhante no desempenho a:
foreach (var t in mythings)
if (t.IsSomeValue && t.IsSomeOtherValue)
DoSomething(t);
Algumas das vantagens de desempenho da abordagem de preguiça para enumeráveis (ao contrário de calcular todos os resultados e armazená-los em uma lista) são que ele usa muito pouca memória (uma vez que apenas um resultado é armazenado por vez) e que não há resultados significativos. custo inicial.
Se o enumerável é apenas parcialmente enumerado, isso é especialmente importante. Considere este código:
things.First();
A maneira como o LINQ é implementado mythings
será enumerado apenas até o primeiro elemento que corresponda às condições where. Se esse elemento estiver no início da lista, isso pode ser um grande aumento de desempenho (por exemplo, O (1) em vez de O (n)).