Când să folosiți o metodă de extensie cu lambda pe LINQtoObjects pentru a filtra o colecție?

Sunt prototipul unor filtre de colectare C# 3 și am dat peste asta. Am o colecție de produse:

public class MyProduct
{
    public string Name { get; set; }
    public Double Price { get; set; }
    public string Description { get; set; }
}

var MyProducts = new  List
{            
    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?"
    }
};

Acum, dacă folosesc LINQ pentru filtrarea funcționează așa cum era de așteptat:

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

Și dacă folosesc metoda extensiei Where în combinație cu un filtru Lambda funcționează și filtrul:

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

Question: What is the difference, and why use one over the other?

0
fr hi bn

4 răspunsuri

LINQ se transformă în apeluri de metode precum codul pe care îl aveți.

Cu alte cuvinte, nu ar trebui să existe nicio diferență.

Cu toate acestea, în cele două coduri pe care nu le apelați .ToList în prima, astfel încât prima piesă de cod va produce o sursă de date enumerabilă, dar dacă apelați .ToList pe aceasta, cele două ar trebui să fie aceleași.

0
adăugat

Altele decât diferența ToList, # 2 este o OMI mult mai ușor de citit și mai natural

0
adăugat

As mentioned d will be IEnumerable while f is List

Conversia este realizată de compilatorul C #

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

Este convertit (înainte de compilarea la IL și cu generice expandate):

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

Rețineți că, în acest caz simplu, aceasta face puțină importanță. În cazul în care Linq devine cu adevărat valoroasă este în bucle mult mai complicate.

De exemplu, această afirmație ar putea include grupuri, comenzi și câteva declarații de tip let, iar acestea vor putea fi citite în format Linq atunci când metoda Metoda() Metoda Metoda() ar deveni complicată.

0
adăugat

Sintaxa pe care o utilizați pentru d va fi transformată de compilator în același IL ca și metodele de extensie. Sintaxa "asemănătoare cu SQL" se presupune a fi o modalitate mai naturală de a reprezenta o expresie LINQ (deși eu prefer personal metodele de extensie). Așa cum am arătat deja, primul exemplu va returna un rezultat IEnumerable, în timp ce al doilea exemplu va returna un rezultat List din cauza apelului către ToList (). Dacă eliminați apelul ToList() în cel de-al doilea exemplu, ambele returnează același rezultat ca și Unde returnează un rezultat IEnumerable.

0
adăugat