Aşağıdaki LINQ ifadesi nasıl çalışır?
İşte benim kod:
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);
}
Çıktı: 2, 4, 6, 8
Neden olmasın 2, 4, 6
?
Aşağıdaki LINQ ifadesi nasıl çalışır?
İşte benim kod:
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);
}
Çıktı: 2, 4, 6, 8
Neden olmasın 2, 4, 6
?
Yanıtlar:
Çıktı ertelenmiş yürütme2,4,6,8
nedeniyle .
Sorgu, sorgu değişkeni oluşturulduğunda değil, sorgu değişkeni yinelendiğinde yürütülür. Buna ertelenmiş icra denir.
- Suprotim Agarwal, " LINQ'da Derhal Sorgu Yürütülmesine Karşı Ertelenmiş"
Sorgu sonuçlarını önbelleğe almak için yararlı olan Hemen Sorgu Yürütme adı verilen başka bir yürütme vardır . Suprotim Agarwal'dan tekrar:
Tek bir değer üretmeyen bir sorgunun hemen yürütülmesini zorlamak için , bir sorgu veya sorgu değişkeninde
ToList(), ToDictionary(), ToArray(), Count(), Average()
veyaMax()
yöntemini çağırabilirsiniz . Bunlar, sonucun bir kopyasını / anlık görüntüsünü oluşturmanıza olanak tanıyan dönüşüm işleçleri olarak adlandırılır ve sorguyu yeniden yürütmeye gerek kalmadan erişim istediğiniz kadar çok sayıdadır.
Çıktının olmasını istiyorsanız 2,4,6
, şunu kullanın .ToList()
:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
.First()
, .FirstOrDefault()
, .Single()
ve .SingleOrDefault()
ayrıca sorgunun değerlendirilmesini tetikler.
Bu, ertelenmiş yürütme nedeniyle oldu, yani ifadenin hesaplanması bir yere ihtiyaç duyuluncaya kadar yürütülmez. Bu, veriler çok büyükse performansı daha iyi hale getirir.
Bunun nedeni lambda ifadenizin ertelenmesi. Foreach döngüsünde yinelemeye başladığınızda sorgu yürütülür.
Bu sonucu ertelenmiş yürütme nedeniyle alıyorsunuz, yani sonuç ilk erişilene kadar değerlendirilmiyor.
Daha net hale getirmek için, snipetinizin sonundaki listeye 10 ekleyin ve tekrar yazdırın, çıktıda 10 almazsınız
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).Tolist();
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
//new*
list.Add(10);
foreach (var i in even)
{
Console.WriteLine(i);
}
10
giriyorum.
8
her iki çıktıda da bulunmayacak .