Le query LINQ sono pigre . Ciò significa che il codice:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
fa molto poco. L'enumerabile originale ( mythings
) viene enumerato solo quando l'enumerabile risultante ( things
) viene consumato, ad esempio da un foreach
ciclo .ToList()
, o .ToArray()
.
Se chiami things.ToList()
, è approssimativamente equivalente al tuo ultimo codice, con forse un certo overhead (di solito insignificante) dagli enumeratori.
Allo stesso modo, se si utilizza 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 gli enumerabili (rispetto al calcolo di tutti i risultati e alla loro memorizzazione in un elenco) sono che utilizza pochissima memoria (poiché viene archiviato un solo risultato alla volta) e che non esiste un significativo -front cost.
Se l'enumerabile è elencato solo parzialmente, questo è particolarmente importante. Considera questo codice:
things.First();
Il modo in cui LINQ è implementato, mythings
verrà elencato solo fino al primo elemento che corrisponde alle condizioni dell'utente. Se quell'elemento è all'inizio dell'elenco, questo può essere un enorme aumento delle prestazioni (ad es. O (1) invece di O (n)).