2011-02-22 23 views
7

¿Es obligatorio que la expresión lambda tenga que utilizarse cuando se utilizará LINQ, o son expresiones lambda opcionales?Sintaxis de la expresión Lambda

En las expresiones lambda, siempre se utiliza el signo =>. Qué significa eso?

customers.Where(c => c.City == "London"); 

Aquí se utiliza c => pero ¿por qué? Qué tipo de significado de usar c =>. Por favor discuta en detalle porque no sé lambda.

Respuesta

7

La expresión lambda

c => c.City == "London" 

es la abreviatura de algo así como

bool IsCustomerInLondon(Customer c) 
{ 
    return (c.City == "London"); 
} 

Es sólo una manera muy concisa de escribir una simple función que devuelve un valor. Se denomina "función anónima" porque nunca se le asigna un nombre ni una definición formal (los tipos de parámetros y el tipo de retorno se deducen del contexto).

(En realidad, no es simplemente taquigrafía; expresiones lambda están relacionados con algunas otras construcciones denominadas closures, que son herramientas muy fresco y potente.)

+0

Tenga en cuenta que las expresiones lambda también se pueden convertir en árboles de expresiones. –

11

No, no ¿Tiene utilizar una expresión lambda. Por ejemplo, su ejemplo Where podría escribirse como:

private static bool IsLondon(Customer customer) 
{ 
    return customer.City == "London"; 
} 

... 

var londoners = customers.Where(IsLondon); 

Eso suponiendo LINQ a objetos, por supuesto. Para LINQ to SQL, etc., necesitaría construir un árbol de expresiones.

cuanto a por qué "=>" se utiliza siempre en una expresión lambda, eso es simplemente porque esa es la forma en que el operador se escribe - es como preguntar por qué se utiliza "+" para la adición.

Una expresión lambda de "c => ..." está dando de manera efectiva la expresión lambda un parámetro llamado c ... en este caso de tipo genérico inferencia proporciona la tipo de c. El cuerpo proporciona una acción para realizar o un cálculo para devolver un valor basado en c.

Una descripción completa de las expresiones lambda está fuera del alcance de esta respuesta. Como un enchufe descarado para my book, sin embargo, están cubiertos en detalle en el capítulo 9 de C# en profundidad.

+0

Hah, editó justo antes que yo: p – TimothyP

1

Lambda LINQ y están bastante separados. Puede utilizar uno sin utilizar la otra (hay partes de LINQ que dependen de las expresiones lambda, pero quieren mantenerlo sencillo :-))

Una expresión lambda es una función anónima que pueden contener expresiones y sentencias, y se pueden usar para crear delegados o árboles de expresiones tipos.

Esto era de MSDN. (http://msdn.microsoft.com/en-us/library/bb397687.aspx)

Para hacerlo corto (es mucho más complejo) puede usar una expresión lambda para hacer una función local. lo que pones antes de = = (en tu ejemplo, c) será el parámetro de la función. El tipo de devolución es "descubierto" por el compilador C#.

c => c.City == "London" es casi equivalente a:

delegate (TheObjectTypeOfC c) { 
    return c.City == London 
}; 

(la diferencia es que alguna expresión lambda son delegados y también expresiones, pero por favor ignore este, que no lo necesitan durante algún tiempo)

Si/cuando el compilador no puede inferir los tipos de los parámetros, puede forzarlos: (MyObject p) => p.SomeProperty != null. Aquí le está diciendo al compilador que p es un parámetro.

Mientras que aquí he mostrado lo que se llama "lambdas expresión", incluso se puede hacer "lambdas declaración":

p => { 
    for (int i = 0; i < 10; i++) { 
     if (p.SomeProperty == 0) { 
      return true; 
     } 
    } 

    return false; 
} 

(no voy a decir cuáles son las diferencias "entre bastidores" entre expresión lambdas y declaración lambdas. Si quieres conocerlas, lee la página msdn que señalé antes)

+0

No están * totalmente * separados, ya que la traducción de expresiones de consulta (que son parte de LINQ) se basa en expresiones lambda. Sin embargo, * es * justo decir que puede usar las bibliotecas LINQ sin usar expresiones lambda. –

1

Jon ya respondió, pero me gustaría añadir esto.

En el ejemplo que han dado, imagina LINQ bucle sobre todos los clientes, yc es simplemente una referencia a cada elemento de la enumerables:

var result = new List<Customer>(); 
foreach(var c in customers) 
{ 
    if (c.City == "London") 
     result.Add(c); 
} 
return result; 

Es una variable, como cualquier otro, que no tiene para ser un solo nombre, pero es solo una convención de algún tipo.

1

no necesita usar expresiones lambda en Lİnq para sql o Entidades; aquí hay una forma alternativa de tu código;

que código:

customers.Where(c => c.City == "London"); 

hacia otro lado;

var query = from cs in customers 
       where cs.City == "London" 
       select cs; 

esta es la otra forma. es tu decision.

4

Piense en lambdas como anónimo de funciones. Trataré de explicarlo con el siguiente código.

public bool IsLondon(Customer customer) 
{ 
    return customer.City == "London"; 
} 

Ahora nos tira hacia abajo nombre de la función y deshacerse de los apoyos:

public bool Customer customer  
    return customer.City == "London"; 

No necesitamos tipo de retorno, porque compilador es capaz de deducir el tipo de la expresión:

customer.City == "London"; 

De la misma manera, el compilador conoce el tipo de entrada, por lo que no es necesario que la especifique.

Así que, básicamente, lo que queda es

customer 
    return customer.City == "London"; 

y la sintaxis lambda en C# es básicamente:

(parameter list) => "expression" 

También puede escribir expresiones "multilínea", pero luego se va a rodea tu código con llaves. También necesitará usar la declaración "return", como lo hace normalmente.

1

No, no es necesario en absoluto.

Tenemos dos formas de escribir consultas LINQ.

Uno es un método de consulta y otro es el método de generador. Solo necesitas poner la expresión lambda en el caso del método de construcción. Por ejemplo, si queremos encontrar todos los estudiantes de un objeto Los estudiantes que tienen más de 70 marcas pero podemos hacer esto en LINQ con el siguiente sintaxis

var data = from p in stdList 
    where p.marks > 70 
    select p; 

o var data = stdList.Where (p => p.marks> 70);

método posterior es el método de compilación, en la función Donde, estamos pasando expresiones lambda.

Las expresiones Lambda son solo atajos de hacer cosas, siempre puedes usar consultas LINQ, pero si quieres evitar la sintaxis entera para simplemente aplicar una condición simple puedes usar los métodos LINQ Builder (que piden expresiones lambda) en lambda expresiones, siempre define algunos alias y luego realiza su operación.

En cuanto al operador =>, funciona igual que el operador de asignación. Por ejemplo:

(p) => p.Gender == “F” 
It means “All persons p, such that person’s Gender is F” 

En alguna literatura esto se llama “predicado”. Otra terminología literatura es “proyección”

(p) => p.Gender ? “F” : “Female” 
“Each person p becomes string “Female” if Gender is “F”” 

Esto se proyección, que utiliza operador ternario. Aunque expliqué con ejemplos muy básicos, espero que esto te ayude. . . :)