Verständnis von LINQ und Erweiterungsmethoden in C#
Bei der Arbeit mit Sammlungen in C# ist die Datenfilterung eine gängige Aufgabe. Entwickler stehen oft an einem Scheideweg und entscheiden sich zwischen der Verwendung der traditionellen LINQ-Syntax oder modernen Lambda-Ausdrücken, die mit Erweiterungsmethoden kombiniert werden. In diesem Blogbeitrag werden die Unterschiede zwischen diesen beiden Ansätzen diskutiert, insbesondere wann eine Erweiterungsmethode mit einem Lambda über LINQ zu Objekten zur Filterung von Sammlungen verwendet werden sollte.
Die vorliegende Sammlung
Betrachten wir ein praktisches Beispiel. Angenommen, wir haben eine Sammlung von Produkten, die durch die Klasse MyProduct
dargestellt wird:
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 = "Das wichtigste, was Sie jemals besitzen werden."
},
new MyProduct
{
Name = "Leash",
Price = 29.28,
Description = "Halten Sie wichtige Dinge in Ihrer Nähe."
},
new MyProduct
{
Name = "Sonnenschutz",
Price = 15.88,
Description = "1000 SPF! Wer könnte mehr verlangen?"
}
};
Filterung mit LINQ
Bei der Verwendung von LINQ zur Filterung ist die Syntax sowohl intuitiv als auch leistungsstark:
var filteredProductsLINQ = (from mp in MyProducts
where mp.Price < 50d
select mp);
In diesem Snippet erstellen wir eine gefilterte Sammlung von Produkten, bei denen der Preis unter 50 $ liegt.
Filterung mit Erweiterungsmethoden und Lambda-Ausdrücken
Ebenso können Sie dasselbe Ergebnis durch die Verwendung einer Erweiterungsmethode mit einem Lambda-Ausdruck erzielen:
var filteredProductsLambda = MyProducts.Where(mp => mp.Price < 50d).ToList();
In diesem Fall wenden wir die Where
-Methode direkt auf die Sammlung MyProducts
an und übergeben einen Lambda-Ausdruck, der unsere Filterkriterien definiert.
Wichtige Unterschiede erklärt
Obwohl beide Ansätze Sammlungen effektiv filtern, gibt es subtile Unterschiede zu beachten:
1. Art der Ausgabe
-
Die LINQ-Abfragesyntax (erstes Beispiel) gibt ein
IEnumerable<MyProduct>
zurück, das eine aufzählbare Datenquelle ist. Wenn es nicht von einem Aufruf wie.ToList()
gefolgt wird, wird es nicht sofort ausgeführt. -
Die zweite Methode mit der
Where
-Erweiterung wird tatsächlich ausgeführt, wenn.ToList()
aufgerufen wird, wodurch eine Liste gefilterter Produkte erstellt wird.
2. Lesbarkeit und Absicht
-
LINQ-Syntax kann für diejenigen, die mit SQL-ähnlicher Syntax vertraut sind, klarer und deklarativer erscheinen.
-
Lambda-Ausdrücke und Erweiterungsmethoden bieten eine prägnante Möglichkeit, die Absicht der Filterung direkt inline darzustellen, was einige Entwickler möglicherweise lesbarer finden.
3. Leistung
- Während beide Methoden ähnliche Leistungsmerkmale für die Filteraufgabe liefern, sollten Sie beachten, dass LINQ-Abfragen manchmal verzögerte Ausführung enthalten können, was praktisch sein kann, wenn die zugrunde liegende Datenquelle groß ist und Sie unnötige Operationen minimieren möchten, bis die gefilterten Ergebnisse benötigt werden.
Fazit: Was zu verwenden?
Letztendlich hängt die Entscheidung von persönlichen oder Team-Präferenzen ab, es sei denn, es gibt spezifische Anforderungen an Lesbarkeit oder Stil. Während es keinen wesentlichen Unterschied bei den Ergebnissen der Filterung mit LINQ im Vergleich zu Erweiterungsmethoden mit Lambdas gibt, kann das Wissen, wann eine Methode der anderen vorzuziehen ist, zur Verbesserung der Klarheit in Ihrem Code beitragen.
- Verwenden Sie LINQ-Syntax, wenn Sie die Klarheit des SQL-ähnlichen Stils bevorzugen.
- Verwenden Sie Erweiterungsmethoden mit Lambdas für einen prägnanteren und potenziell lesbareren Ansatz.
Das Verständnis der Praktiken Ihres Teams und des Kontexts, in dem Sie programmieren, wird Ihnen helfen, die beste Wahl zu treffen.
Indem Sie diese Aspekte berücksichtigen, können Sie fundierte Entscheidungen treffen, wie Sie Sammlungen in Ihren C#-Projekten effektiv filtern können.