2008-08-07 6 views
11

Ich entwickle einige C# 3 Sammlungsfilter und stieß auf diese. Ich habe eine Sammlung von Produkten:Wann sollte eine Erweiterungsmethode mit Lambda über LINQtoObjects verwendet werden, um eine Auflistung zu filtern?

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?" 
    } 
}; 

Nun, wenn ich LINQ verwenden zu filtern wie erwartet funktioniert:

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

Und wenn ich die Wo-Extension-Methode mit einem Lambda kombiniert verwende das Filter arbeitet als gut:

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

Frage: Was ist der Unterschied, und warum man über den anderen verwenden?

Antwort

5

LINQ wird zu Methodenaufrufen wie der Code, den Sie haben.

Mit anderen Worten, es sollte keinen Unterschied geben.

In Ihren beiden Code-Stücken rufen Sie jedoch nicht .ToList in der ersten, so dass das erste Stück Code eine aufzählbare Datenquelle erzeugen wird, aber wenn Sie .ToList darauf aufrufen, sollten die beiden gleich sein .

0

Andere als die ToList Unterschied, # 2 ist viel besser lesbar und natürliche IMO

4

Wie erwähnt d IEnumerable<MyProduct> sein wird, während f List<MyProduct>

Die Umwandlung von der C# Compiler durchgeführt wird

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

wird konvertiert in (vor der Kompilierung in IL und mit erweiterten Generika):

Beachten Sie, dass es in diesem einfachen Fall keinen großen Unterschied macht. Wo Linq wirklich wertvoll wird, ist in viel komplizierteren Schleifen.

Zum Beispiel könnte diese Aussage Gruppierungen, Befehle und einige let-Anweisungen enthalten und im Linq-Format noch lesbar sein, wenn das Äquivalent .Method().Method.Method() kompliziert würde.

0

Die Syntax, die Sie für d verwenden, wird vom Compiler in dieselbe IL konvertiert wie die Erweiterungsmethoden. Die "SQL-ähnliche" Syntax soll eine natürlichere Art sein, einen LINQ-Ausdruck darzustellen (obwohl ich persönlich die Erweiterungsmethoden bevorzuge). Wie bereits erwähnt, gibt das erste Beispiel ein IEnumerable-Ergebnis zurück, während das zweite Beispiel ein List-Ergebnis aufgrund des Aufrufs von ToList() zurückgibt. Wenn Sie den Aufruf von ToList() in dem zweiten Beispiel entfernen, werden beide das gleiche Ergebnis wie Where ein IEnumerable-Ergebnis zurückgeben.

Verwandte Themen