Le query LINQ sono pigri . Ciò significa che il codice:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
fa molto poco. L'enumerazione originale ( mythings
) viene enumerata solo quando viene consumata l'enumerabile risultante ( things
), ad es. di un foreach
loop, .ToList()
o .ToArray()
.
Se chiami things.ToList()
, è approssimativamente equivalente al tuo ultimo codice, con forse un sovraccarico (solitamente insignificante) degli enumeratori.
Allo stesso modo, se usi un ciclo foreach:
foreach (var t in things)
DoSomething(t);
È simile nelle prestazioni a:
foreach (var t in mythings)
if (t.IsSomeValue && t.IsSomeOtherValue)
DoSomething(t);
Alcuni dei vantaggi prestazionali dell'approccio alla pigrizia per enumerabili (al contrario del calcolo di tutti i risultati e della loro memorizzazione in una lista) sono che utilizza pochissima memoria (poiché un solo risultato è memorizzato alla volta) e che c'è nessun costo iniziale significativo.
Se l'enumerabile è enumerato solo parzialmente, ciò è particolarmente importante. Considera questo codice:
things.First();
Il modo in cui LINQ è implementato, mythings
sarà enumerato solo fino al primo elemento che corrisponde alle tue condizioni. Se quell'elemento è in cima alla lista, questo può essere un enorme incremento delle prestazioni (ad es. O (1) invece di O (n)).