LINQ-запити ледачі . Це означає код:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
робить дуже мало. Оригінальний перелічувальний ( mythings
) перераховується лише тоді, коли отримане число ( 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)).