LINQ sorguları tembeldir . Bu kod anlamına gelir:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
çok az şey yapar. Orijinal numaralandırılabilir ( mythings
) yalnızca elde edilen numaralandırılabilir ( things
), örneğin bir foreach
döngü .ToList()
veya tarafından tüketildiğinde numaralandırılır .ToArray()
.
Eğer ararsanız things.ToList()
, bu ikinci kodunuza kabaca eşdeğerdir, belki de numaralandırıcılardan bazılarının (genellikle önemsiz) yükü vardır.
Benzer şekilde, bir foreach döngüsü kullanıyorsanız:
foreach (var t in things)
DoSomething(t);
Performansta şuna benzer:
foreach (var t in mythings)
if (t.IsSomeValue && t.IsSomeOtherValue)
DoSomething(t);
Numaralandırılabilirler için tembellik yaklaşımının performans avantajlarından bazıları (tüm sonuçları hesaplamak ve bir listede saklamak yerine) çok az bellek kullanmasıdır (çünkü bir seferde yalnızca bir sonuç depolanır) ve önemli bir şey olmaması - ön maliyet.
Numaralandırılabilir yalnızca kısmen numaralandırılmışsa, bu özellikle önemlidir. Bu kodu düşünün:
things.First();
LINQ'nun uygulanma şekli, mythings
yalnızca konum koşullarınıza uyan ilk öğeye kadar numaralandırılır. Bu öğe listenin başındaysa, bu büyük bir performans artışı olabilir (örneğin O (n) yerine O (1)).