2009-10-07 6 views
7

Que retourne exactement une fonction LINQ lorsqu'il n'y a pas de correspondance? Prenez la méthode Où, par exemple:Résultats LINQ lorsqu'il n'y a pas de correspondance?

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

Quelle serait dans les résultats à ce point?

+3

Ce qui se trouverait dans "results" est * un objet qui représente la requête *. Rappelez-vous: l'objet de requête n'est pas le résultat de la requête. L'objet de requête est quelque chose que vous pouvez * itérer pour obtenir les résultats de la requête *, ce n'est pas le résultat lui-même. –

Répondre

9

results lui-même est juste une requête. Jusqu'à ce que vous commenciez à itérer (soit explicitement ou via un appel comme Count()), rien n'a vérifié s'il y a des résultats ou pas. C'est seulement quand vous l'énumérez que tout va arriver.

Vous pourriez faire:

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

Ou:

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

Chacune de ces causerez le prédicat à évaluer pour chaque élément de la gamme ... mais avant, il a gagné Ne sois pas appelé du tout.

Ceci est une chose importante à comprendre, car cela signifie que resultsne pouvait pas êtrenull tout en conservant la fonction de l'évaluation paresseuse - jusqu'à ce que vous avez essayé d'utiliser results, il n'aurait pas fonctionné si elle devrait être null ou pas!

+0

J'ai tout oublié de l'évaluation paresseuse. * smacks self * – jasonh

+0

Notez que la "requête" dont vous parlez est vraiment une IEnumerable d'une sorte qui n'a pas réellement rempli ses données ... – RCIX

2

Une référence à un vide IEnumerable<T>.

+0

Excellent! C'est ce que je cherchais. Je voulais être sûr que je n'avais pas à vérifier null. – jasonh

+1

Nitpick: Une référence à un vide IEnumerable - pas une collection –

+0

Vous êtes en sécurité, c'est une bonté sucrée! –

4

Dans ce cas, il renvoie IEnumerable<Int32> avec un total de 0 éléments.

+4

Cela donne l'impression qu'il "sait" qu'il y a un compte de 0 - ce qui n'est pas le cas. La valeur retournée est un 'IEnumerable ' qui, lorsqu'elle est répétée, donnera 0 élément. Il ne le sait pas avant - il doit essayer le prédicat contre chaque valeur pour le savoir, et il ne le fait pas jusqu'à ce que vous le demandiez. –

+0

@Jon: certainement, merci pour la clarification. Comme vous l'avez mentionné dans votre message, il doit être utilisé pour déterminer le résultat. –

Questions connexes