Wanneer 'n uitbreiding metode gebruik met lambda oor LINQtoObjects om 'n versameling filter?

StackOverflow https://stackoverflow.com/questions/5194

  •  08-06-2019
  •  | 
  •  

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

Was dit nuttig?

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.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top