Zapytania LINQ są leniwe . To oznacza kod:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
robi bardzo mało. Pierwotny enumerable ( mythings
) jest wyliczany tylko wtedy, gdy wynikowy enumerable ( things
) jest zużywany, np. Przez foreach
pętlę .ToList()
lub .ToArray()
.
Jeśli zadzwonisz things.ToList()
, jest to mniej więcej odpowiednik twojego ostatniego kodu, być może z pewnym (zwykle nieistotnym) narzutem z liczników.
Podobnie, jeśli używasz pętli foreach:
foreach (var t in things)
DoSomething(t);
Jego działanie jest podobne do:
foreach (var t in mythings)
if (t.IsSomeValue && t.IsSomeOtherValue)
DoSomething(t);
Niektóre zalety wydajności lenistwa dla wyliczeń (w przeciwieństwie do obliczania wszystkich wyników i przechowywania ich na liście) polegają na tym, że zużywa bardzo mało pamięci (ponieważ przechowywany jest tylko jeden wynik na raz) i że nie ma znaczącego wzrostu koszt początkowy.
Jeśli wyliczalny jest tylko częściowo wyliczony, jest to szczególnie ważne. Rozważ ten kod:
things.First();
Sposób, w jaki LINQ jest implementowany, mythings
będzie wyliczany tylko do pierwszego elementu, który pasuje do twoich warunków where. Jeśli ten element znajduje się na początku listy, może to być ogromny wzrost wydajności (np. O (1) zamiast O (n)).