Las consultas de LINQ son perezosas . Eso significa el código:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
hace muy poco El enumerable original ( mythings
) solo se enumera cuando things
se consume el enumerable resultante ( ), por ejemplo, mediante un foreach
bucle .ToList()
, o .ToArray()
.
Si llama things.ToList()
, es más o menos equivalente a su último código, con quizás una sobrecarga (generalmente insignificante) de los enumeradores.
Del mismo modo, si usa un bucle foreach:
foreach (var t in things)
DoSomething(t);
Es similar en rendimiento a:
foreach (var t in mythings)
if (t.IsSomeValue && t.IsSomeOtherValue)
DoSomething(t);
Algunas de las ventajas de rendimiento del enfoque de la pereza para los enumerables (en lugar de calcular todos los resultados y almacenarlos en una lista) es que utiliza muy poca memoria (ya que solo se almacena un resultado a la vez) y que no hay un aumento significativo -costo por adelantado.
Si lo enumerable solo se enumera parcialmente, esto es especialmente importante. Considera este código:
things.First();
La forma en que se implementa LINQ mythings
solo se enumerará hasta el primer elemento que coincida con sus condiciones where. Si ese elemento está al principio de la lista, esto puede ser un gran aumento de rendimiento (por ejemplo, O (1) en lugar de O (n)).