Bagaimana cara kerja pernyataan LINQ berikut ?
Ini kode saya:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
Keluaran: 2, 4, 6, 8
Mengapa tidak 2, 4, 6
?
Jawaban:
Outputnya adalah
2,4,6,8
karena eksekusi yang ditangguhkan .Ada eksekusi lain yang disebut Eksekusi Kueri Segera , yang berguna untuk caching hasil pencarian. Dari Suprotim Agarwal lagi:
Jika Anda ingin hasilnya
2,4,6
, gunakan.ToList()
:sumber
.First()
,.FirstOrDefault()
,.Single()
dan.SingleOrDefault()
juga memicu evaluasi query.Ini terjadi karena eksekusi yang ditangguhkan, yang berarti bahwa perhitungan ekspresi tidak dieksekusi sampai diperlukan di suatu tempat. Ini membuat kinerja lebih baik jika datanya terlalu besar.
sumber
Alasan untuk ini adalah eksekusi yang ditangguhkan dari ekspresi lambda Anda. Kueri dieksekusi ketika Anda mulai iterasi di loop foreach.
sumber
Ketika Anda menggunakan IEnumerable <> yang diperoleh dari LINQ, hanya dibuat kelas Enumerator dan iterasi hanya dimulai ketika Anda menggunakannya dalam beberapa langkah.
sumber
Anda mendapatkan hasil ini karena eksekusi yang ditangguhkan yang berarti hasil sebenarnya tidak dievaluasi sampai diakses pertama kali.
Untuk membuatnya lebih jelas, tambahkan saja 10 ke daftar di ujung snipet Anda dan kemudian cetak lagi Anda tidak akan mendapatkan 10 output
sumber
10
output.8
dalam output mana pun.