valor significado programacion life half craneo aws anatomia c# linq .net-3.5 lambda

c# - significado - lambda symbol



¿Cuándo usar un método de extensión con lambda sobre LINQtoObjects para filtrar una colección? (4)

LINQ se convierte en llamadas a métodos como el código que tienes.

En otras palabras, no debería haber diferencia.

Sin embargo, en sus dos códigos no está llamando .ToList en el primero, de modo que el primer fragmento de código generará una fuente de datos enumerable, pero si llama a .ToList en él, los dos deberían ser iguales.

Estoy creando prototipos de algunos filtros de colección C # 3 y me encontré con esto. Tengo una colección de productos:

public class MyProduct { public string Name { get; set; } public Double Price { get; set; } public string Description { get; set; } } var MyProducts = new List<MyProduct> { new MyProduct { Name = "Surfboard", Price = 144.99, Description = "Most important thing you will ever own." }, new MyProduct { Name = "Leash", Price = 29.28, Description = "Keep important things close to you." } , new MyProduct { Name = "Sun Screen", Price = 15.88, Description = "1000 SPF! Who Could ask for more?" } };

Ahora si uso LINQ para filtrar, funciona como se espera:

var d = (from mp in MyProducts where mp.Price < 50d select mp);

Y si uso el método de extensión Where combinado con un Lambda, el filtro también funciona:

var f = MyProducts.Where(mp => mp.Price < 50d).ToList();

Pregunta: ¿Cuál es la diferencia, y por qué usar una sobre la otra?


Aparte de la diferencia ToList, # 2 es mucho más legible y natural IMO


Como se mencionó, d será IEnumerable<MyProduct> mientras que f es List<MyProduct>

La conversión se realiza mediante el compilador de C #

var d = from mp in MyProducts where mp.Price < 50d select mp;

Se convierte en (antes de la compilación en IL y con genéricos expandidos):

var d = MyProducts. Where<MyProduct>( mp => mp.Price < 50d ). Select<MyProduct>( mp => mp ); //note that this last select is optimised out if it makes no change

Tenga en cuenta que en este caso simple tiene poca importancia. Donde Linq se vuelve realmente valioso es en circuitos mucho más complicados.

Por ejemplo, esta declaración podría incluir grupos bys, pedidos y unas pocas declaraciones de let y aún así ser legible en formato Linq cuando el .Method().Method.Method() equivalente .Method().Method.Method() sería complicado.


La sintaxis que está utilizando para d será transformada por el compilador en la misma IL que los métodos de extensión. Se supone que la sintaxis "SQL-like" es una forma más natural de representar una expresión LINQ (aunque personalmente prefiero los métodos de extensión). Como ya se ha señalado, el primer ejemplo arrojará un resultado de IEnumerable, mientras que el segundo ejemplo arrojará un resultado de la Lista debido a la llamada a ToList (). Si elimina la llamada a Lista () en el segundo ejemplo, ambos devolverán el mismo resultado que Donde devuelve un resultado de IEnumerable.