Las
consultas LINQ son flojas . 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 se consume el enumerable resultante ( things
), por ejemplo. por un bucle foreach
, .ToList()
o .ToArray()
.
Si llama a 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 utiliza 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 holgazanería para los enumerables (en lugar de calcular todos los resultados y almacenarlos en una lista) son que utiliza muy poca memoria (ya que solo se almacena un resultado a la vez) y que hay no hay costos iniciales significativos.
Si el enumerable solo se enumera parcialmente, esto es especialmente importante. Considere este código:
things.First();
La forma en que se implementa LINQ, mythings
solo se enumerará hasta el primer elemento que coincida con las condiciones de su ubicación. Si ese elemento se encuentra al principio de la lista, este puede ser un gran aumento del rendimiento (por ejemplo, O (1) en lugar de O (n)).