2009-10-07 13 views
7

Cosa restituisce esattamente una funzione LINQ quando non ci sono corrispondenze? Prendi il metodo Where, ad esempio:I risultati LINQ quando non ci sono corrispondenze?

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

Quale sarebbe il risultato a questo punto?

+3

Quale sarebbe in "risultati" è * un oggetto che rappresenta la query *. Ricorda: l'oggetto query NON è il risultato della query. L'oggetto query è qualcosa che puoi * iterare per ottenere i risultati della query *, non è esso stesso i risultati. –

risposta

9

results è solo una query. Fino a quando non inizi ad iterarlo (esplicitamente o tramite una chiamata come Count()), nulla ha verificato se ci sono risultati o meno. È solo quando lo enumerate che qualcosa accadrà.

Così si potrebbe fare:

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

Oppure:

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

uno qualsiasi di questi causare il predicato di essere valutata a fronte di ogni elemento della gamma ... ma prima di allora, ha vinto essere chiamato affatto

Questa è una cosa importante da capire, perché vuol dire che resultsnon poteva essere null, pur mantenendo la caratteristica di valutazione pigra - fino a quando si è tentato di usoresults, non avrebbe funzionato se è dovrebbe essere null o no!

+0

Ho dimenticato tutto della valutazione pigra. * smack self * – jasonh

+0

Si noti che la "query" di cui si sta parlando realmente è un IEnumerable di qualche tipo che non ha effettivamente popolato i suoi dati ... – RCIX

2

Un riferimento a un vuoto IEnumerable<T>.

+0

Eccellente! Questo è quello che stavo cercando. Volevo essere sicuro di non dover controllare nulla. – jasonh

+1

Nitpick: un riferimento a un IEnumerable vuoto - non una collezione –

+0

Sì, sei al sicuro, è zuccherosa bontà! –

4

In questo caso restituisce un IEnumerable<Int32> con un conteggio di 0 articoli.

+4

Questo fa sembrare che "sappia" che c'è un conteggio di 0, che non è così. Il valore restituito è un 'IEnumerable ' che, una volta iterato, produrrà 0 elementi. Ma non lo sa in anticipo - deve cercare il predicato contro ogni valore per scoprirlo, e non lo fa finché non lo chiedi. –

+0

@Jon: sicuramente, grazie per aver chiarito. Come hai detto nel tuo post, deve essere usato per determinare il risultato. –

Problemi correlati