2009-10-07 27 views
7

Eşleşme olmadığında LINQ işlevi ne tam olarak geri döner? Aşağıdaki yöntemi kullanın, örneğin:LINQ sonuçları?

var numbers = Enumerable.Range(1, 10); 
var results = numbers.Where(n => n == 50); 

Bu noktada sonuçlarda ne olurdu?

+3

"results" içinde ne olurdu * sorguyu temsil eden bir nesne *. Unutmayın: sorgu nesnesi, sorgunun sonuçları DEĞİLDİR. Sorgu nesnesi yapabileceğiniz bir şeydir * Sorgunun sonuçlarını almak için yineleyin *, sonuçların kendisi değildir. –

cevap

9

results sadece bir sorundur. Bunu (ya da Count() gibi bir çağrı yoluyla) yinelemeye başlayana kadar, hiçbir sonuç olup olmadığını hiçbir şey kontrol etmedi. Sadece bir şeylerin olacağını söylersen onu numaralandırırsın.

foreach (int x in results) 
{ 
    Console.WriteLine("This won't happen"); 
} 

Veya:

Yani yapabileceğini

Console.WriteLine(results.Any()); // Will print false 
Console.WriteLine(results.Count()); // Will print 0 

Bunlardan herhangi yüklem aralığında her öğenin karşı değerlendirilmesine sebep olur ... ama sonra önce o kazandı hiç çağrılmamalı. o tembel değerlendirme özelliğini korurken resultsnull olmayabilir anlamına gelir çünkü

Bu, anlaşılması gereken önemli bir şey -results, bunun olmadığını çalıştı olmazdı kullanım çalışana kadar null olmalı ya da değil!

+0

Tüm tembel değerlendirme hakkında unuttum. * smacks kendini * – jasonh

+0

Gerçekten bahsettiğiniz "sorgu", aslında veriyi doldurmamış bir tür IEnumerable olduğunu unutmayın ... – RCIX

2

Boş bir başvuru için bir IEnumerable<T>.

+0

Mükemmel! Aradığım şey bu. Boş olup olmadığını kontrol etmem gerektiğinden emin olmak istedim. – jasonh

+1

Nitpick: Boş bir IEnumerable - bir koleksiyona değil –

+0

Yup güvenli, şekerli iyilik! –

4

Bu durumda 0 öğeyi içeren IEnumerable<Int32> değerini döndürür. Sadece bir sorgudur.

+4

Bu, "bilir" gibi ses çıkarır 0 sayısı var - ki yok. Döndürülen değer, yinelenen 0 öğeyi vereceği IEnumerable 'dur. Bunu önceden bilmez - bunu bulmak için her bir değere karşı yüklemeyi denemek zorundadır ve bunu siz isteyinceye kadar bunu yapmaz. –

+0

@Jon: kesinlikle, açıkladığınız için teşekkürler. Gönderinizde belirttiğiniz gibi, sonucu belirlemek için kullanılmalıdır. –