LINQ-запросы ленивы . Это означает, что код:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
очень мало Исходный enumerable ( mythings
) перечисляется только тогда, когда полученный enumerable ( things
) используется, например, foreach
циклом .ToList()
или .ToArray()
.
Если вы звоните things.ToList()
, это примерно эквивалентно вашему последнему коду, возможно, с некоторыми (обычно незначительными) издержками от перечислителей.
Аналогично, если вы используете цикл foreach:
foreach (var t in things)
DoSomething(t);
По производительности он похож на:
foreach (var t in mythings)
if (t.IsSomeValue && t.IsSomeOtherValue)
DoSomething(t);
Некоторые из преимуществ производительности при использовании метода лени для перечислимых данных (в отличие от вычисления всех результатов и сохранения их в списке) заключаются в том, что он использует очень мало памяти (поскольку за один раз сохраняется только один результат) и что значительного стоимость.
Если перечислимое перечислено только частично, это особенно важно. Рассмотрим этот код:
things.First();
Способ реализации LINQ mythings
будет перечисляться только до первого элемента, который соответствует вашим условиям. Если этот элемент находится в начале списка, это может значительно повысить производительность (например, O (1) вместо O (n)).