Pregunta Sintaxis de la expresión Lambda


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

En expresiones lambda, el signo => siempre se usa Qué significa eso?

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

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


7
2018-02-22 18:37


origen


Respuestas:


La expresión lambda

c => c.City == "London"

es una abreviatura de algo así como

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

Es solo una forma muy concisa de escribir una función simple 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 sólo taquigrafía; expresiones lambda están relacionadas con algunos otros constructos llamados cierres, que son herramientas muy geniales y potentes).


7
2018-02-22 18:42



No, tu no tener usar una expresión lambda Por ejemplo, tu Where ejemplo podría escribirse como:

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

...

var londoners = customers.Where(IsLondon);

Eso está asumiendo LINQ to Objects, por supuesto. Para LINQ to SQL, etc., necesitaría construir un árbol de expresiones.

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

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

Una descripción completa de las expresiones lambda está más allá del alcance de esta respuesta. Como un enchufe descarado para mi libroSin embargo, están cubiertos en detalle en el capítulo 9 de C # en profundidad.


11
2018-02-22 18:40



Piensa 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 deshacemos el nombre de la función y eliminamos las llaves:

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

No necesitamos el tipo de devolución, porque el compilador puede deducir el tipo de 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.

Básicamente, lo que dejamos es

customer
   return customer.City == "London";

Y la sintaxis lambda en c # es básicamente:

(parameter list) => "expression"

También puede escribir expresiones de "varias líneas", pero luego debe rodear su código con llaves. También necesitará usar la declaración "return", como lo hace normalmente.


4
2018-02-22 18:49



Jon ya respondió, pero me gustaría agregar esto

En el ejemplo que usted ha dado, imagínese Linq pasando por encima de todos los clientes, y c es simplemente una referencia a cada elemento en el enumerable:

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

Es una variable como cualquier otra, no tiene que ser una sola llamada, pero es solo una convención de algún tipo.


1
2018-02-22 18:44



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

tu código:

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

La otra manera;

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

esta es la otra forma. es tu decision.


1
2018-02-22 18:46



Lambda y linq están bastante separados. Puedes usar uno sin usar el otro (hay partes de linq que dependen de expresiones lambda, pero queremos que sea simple :-))

Una expresión lambda es anónima   función que puede contener expresiones   y declaraciones, y se puede utilizar para   crear delegados o árbol de expresiones   tipos.

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

Para hacerlo breve (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 algunas expresiones lambda son delegados y también expresiones, pero por favor ignórenlo, no lo necesitarán por un 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í te mostré lo que se llama "expresión lambdas", incluso puedes hacer "declaración lambdas":

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

   return false;
}

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


1
2018-02-22 18:42



No, no es necesario en absoluto.

Tenemos dos formas de escribir consultas LINQ.

Uno es el método de consulta y el otro es el método de constructor. 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 algún objeto de Estudiantes que tengan más calificaciones que 70. pero podemos hacer esto en LINQ con la siguiente sintaxis

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

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

el enfoque 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 completa de la consulta para simplemente aplicar una condición simple, puedes usar los métodos LINQ Builder (que piden expresiones lambda) en expresiones lambda, siempre defina un alias y luego realice su operación.

En lo que respecta 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 algunas publicaciones, esto se llama "predicado". Otra terminología de la literatura es "Proyección"

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

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


1
2018-03-04 14:19