Pertanyaan LINQ malas . Itu berarti kode:
var things = mythings
.Where(x => x.IsSomeValue)
.Where(y => y.IsSomeOtherValue);
sangat sedikit. Enumerable asli ( mythings
) hanya disebutkan ketika enumerable yang dihasilkan ( things
) dikonsumsi, misalnya dengan foreach
loop .ToList()
,, atau .ToArray()
.
Jika Anda menelepon things.ToList()
, ini kira-kira setara dengan kode terakhir Anda, dengan mungkin beberapa (biasanya tidak signifikan) overhead dari enumerator.
Demikian juga, jika Anda menggunakan loop foreach:
foreach (var t in things)
DoSomething(t);
Ini serupa dalam kinerja dengan:
foreach (var t in mythings)
if (t.IsSomeValue && t.IsSomeOtherValue)
DoSomething(t);
Beberapa keuntungan kinerja dari pendekatan kemalasan untuk enumerables (sebagai lawan menghitung semua hasil dan menyimpannya dalam daftar) adalah bahwa ia menggunakan memori yang sangat sedikit (karena hanya satu hasil disimpan pada satu waktu) dan bahwa tidak ada peningkatan signifikan - biaya awal.
Jika enumerable hanya disebutkan sebagian, ini sangat penting. Pertimbangkan kode ini:
things.First();
Cara LINQ diimplementasikan, mythings
hanya akan disebutkan hingga elemen pertama yang cocok dengan kondisi tempat Anda. Jika elemen tersebut berada di awal daftar, ini bisa menjadi peningkatan kinerja yang sangat besar (misalnya O (1), bukan O (n)).