2009-10-07 14 views
13

Parece que me he perdido algo simple en la sintaxis, pero me gustaría obtener los resultados de FirstOrDefault de una instrucción linq directamente sin tener que almacenar primero IEnumerable en una variable temporal. Algo como esto:Comportamiento FirstOrDefault directamente en la instrucción LINQ

var bestCar = from c in cars 
       orderby c.Price 
       select first c 

sé la palabra clave primera no existe realmente, pero ilustra lo que me gustaría hacer. También sé que puedo ajustar el ... desde seleccionar la instrucción entre paréntesis y llamar a FirstOrDefault directamente, pero creo que la sintaxis anterior es más clara y fácil de leer.

+0

¿Cuál es su pregunta exactamente? –

Respuesta

23

Enumerable.FirstOrDefault es uno de los métodos de extensión de la clase Enumerable que no tienen un elemento de sintaxis LINQ correspondiente. La única forma de vincularse a este método es a través de la sintaxis de llamada del método.

puede evitar el temporal haciendo lo follownig

var bestCar = (from c in cars 
       orderby c.Price 
       select c).FirstOrDefault(); 
+0

Aunque esto se entiende como un ejemplo de 'FirstOrDefault()', parece mejor suponer que dicho enumerable ya está ordenado, ya que el orden es asintóticamente inferior a simplemente 'MaxBy (c => c.Price)'. –

3

    var bestCar = (from c in cars 
       orderby c.Price 
       select c).FirstOrDefault(); 

Lo siento, no leí completamente su pregunta, parece que esto puede ser exactamente lo que no desea hacer.

4
var bestCar = (from c in cars 
      orderby c.Price 
      select c).FirstOrDefault() 

O

var bestCar = cars.OrderBy(c => c.Price).FirstOrDefault() 
7

No hay una manera de hacerlo. LINQ se usa para definir una consulta. Hacer eso en realidad no causa una evaluación, mientras que ejecutar FirstOrDefault (o enumerar sobre él) ejecuta la consulta.

Cuestiones relacionadas