Wanneer 'n uitbreiding metode gebruik met lambda oor LINQtoObjects om 'n versameling filter?
Vra
Ek prototyping paar C # 3 versameling filters en afgekom hierdie. Ek het 'n versameling van produkte:
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?"
}
};
Nou as ek gebruik LINQ te filtreer dit werk soos verwag:
var d = (from mp in MyProducts
where mp.Price < 50d
select mp);
As ek die Waar uitbreiding metode gekombineer met 'n Lambda gebruik die filter werk sowel:
var f = MyProducts.Where(mp => mp.Price < 50d).ToList();
Vraag: Wat is die verskil, en waarom gebruik een oor die ander
Oplossing
LINQ draai in metode oproepe soos die kode wat jy het.
Met ander woorde, daar moet geen verskil wees.
Maar in jou twee stukke kode wat jy nie noem .ToList in die eerste, so die eerste stukkie van die kode sal 'n enumerable data bron produseer, maar as jy .ToList 'n beroep op dit, moet die twee weer dieselfde wees nie.
Ander wenke
As genoem d sal IEnumerable<MyProduct>
terwyl f is List<MyProduct>
Die omskakeling is gedoen deur die C # samesteller
var d =
from mp in MyProducts
where mp.Price < 50d
select mp;
omgeskakel word na (voor samestelling te IL en met generiese uitgebrei):
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
Let daarop dat in hierdie eenvoudige geval dit maak min verskil. Waar Linq raak regtig waardevol is in baie meer ingewikkeld loops.
Byvoorbeeld hierdie stelling groep-gangers, bestellings en 'n paar laat state kan die volgende insluit en nog leesbaar in Linq formaat wanneer die ekwivalent .Method().Method.Method()
ingewikkeld sou kry.
Anders as die ToList verskil, # 2 is 'n baie meer leesbare en natuurlike IMO
Die sintaksis jy gebruik vir d sal kry verander deur die samesteller in dieselfde IL as die uitbreiding metodes. Die "SQL-agtige" sintaksis is veronderstel om 'n meer natuurlike manier om 'n LINQ uitdrukking verteenwoordig (alhoewel ek persoonlik verkies om die uitbreiding metodes) wees. Soos reeds uitgewys, sal die eerste voorbeeld 'n IEnumerable gevolg terugkeer terwyl die tweede voorbeeld gevolg Lys sal terugkeer as gevolg van die oproep om ToList (). As jy die ToList () oproep in die tweede voorbeeld te verwyder, sal hulle albei terugkeer dieselfde resultaat as Waar terug 'n IEnumerable gevolg.