2009-10-07 12 views
7

¿Qué devuelve exactamente una función LINQ cuando no hay coincidencias? Tome el método Where, por ejemplo:resultados LINQ cuando no hay coincidencias?

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

¿Qué resultados habría en este momento?

+3

Lo que estaría en "resultados" es * un objeto que representa la consulta *. Recuerde: el objeto de consulta NO es el resultado de la consulta. El objeto de consulta es algo que puede * iterar para obtener los resultados de la consulta *, no es en sí mismo el resultado. –

Respuesta

9

results en sí es solo una consulta. Hasta que no comience a recorrerlo (ya sea explícitamente o mediante una llamada como Count()), nada ha comprobado si hay algún resultado o no. Solo cuando lo enumera todo sucederá.

Por lo que podría hacer:

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

O:

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

Cualquiera de estos hará que el predicado se evaluará en cada elemento de la gama ... pero antes de eso, se ganó no se llamará en absoluto.

Esto es una cosa importante de entender, ya que significa que no results podría ser null mientras que conserva la función de la evaluación perezosa - hasta que se trató de usoresults, no habría funcionado si debe ser null o no!

+0

Olvidé todo acerca de la evaluación perezosa. * huele a sí mismo * – jasonh

+0

Tenga en cuenta que la "consulta" de la que está hablando en realidad es un tipo de IEnumerable que en realidad no ha poblado sus datos ... – RCIX

2

Una referencia a un IEnumerable<T> vacío.

+0

¡Excelente! Eso es lo que estaba buscando. Quería asegurarme de que no tenía que verificar nulo. – jasonh

+1

Nitpick: una referencia a un IEnumerable vacío - no es una colección –

+0

¡Sí, está seguro, es una delicia azucarada! –

4

En este caso, devuelve IEnumerable<Int32> con un recuento de 0 elementos.

+4

Eso lo hace sonar como si "supiera" que hay un recuento de 0, que no es así. El valor devuelto es un 'IEnumerable ' que, cuando se repite, producirá 0 elementos. Sin embargo, no lo sabe de antemano: tiene que probar el predicado con cada valor para descubrirlo, y no lo hace hasta que se lo pida. –

+0

@Jon: definitivamente, gracias por aclarar. Como mencionaste en tu publicación, debe usarse para determinar el resultado. –

Cuestiones relacionadas