C# LINQ Funktionen höherer Ordnung
Allgemein ● Language Integrated Query ● Verfahren von Microsoft zum Zugriff auf Daten ● Hauptentwickler Erik Meijer
Aufbau
Arbeitsweise ● Linq Anweisungen werden zu Quellcode übersetzt. ● Abfrageergebnisse übergibt Linq typisiert. ● Die Linq Provider übersetzten die Anfragen in spezielle Zugriffsmethoden. ● Provider: Linq to Objects,... ● Drittanbeiter: Linq to Amazon
Ziel ● Verschiedene Datenquellen mit den selben Zugriffsmethoden zu nutzen. ● Datenquellen: Object (Listen) SQL XML ● Es werden keine unübersichtlichen Schleifen mehr benötigt. ● Der zugriff auf Daten in einer Liste wird verkürzt. ● Im Linq Teil des Programmcodes können keine Seiteneffekte auftreten. ● Compiler hat bessere Optimierungsmöglichkeiten.
Notationsformen var v = from i in zahlen select i * i; var v = zahlen.Select(i => i * i); var v = zahlen.Select(SelectFkt); int SelectFkt(int i) { return i * i; }
Typbeziehungen einer Abfrage
Aufbau einer Funktion höherer Ordnung Haskell: map :: (Int -> Int) -> [Int] -> [Int] map f (x:xs) = (f x) : map f xs Linq: IEnumerable Map(Func fkt, int[] zahlen) { return from i in zahlen select fkt(i); }
Typbeziehungen bei Funkionen höherer Ordnung Haskell: map :: (Int -> Int) -> [Int] -> [Int] map f (x:xs) = (f x) : map f xs Linq: IEnumerable Map(Func fkt, int[] zahlen) { return from i in zahlen select fkt(i); }
Foldl / Foldr Foldl (-) 0 [ 9, 4, 11, 3, 5] -32 new int[] { 9, 4, 11, 3, 5 }.Aggregate(0, (r, i) => r – i); -32 Foldr (-) 0 [ 9, 4, 11, 3, 5] 18 new int[] { 9, 4, 11, 3, 5 }.Aggregate(0, (r, i) => i - r); 18
Foldl / Foldr Unterschied zu Haskell: Die Aggregate Funktion benötigt keinen Startwert. In diesem Fall wird beim ersten Aufruf der übergebenen Funktion mit dem ersten und zweiten Element der Liste begonnen. new int[] { 9, 4, 11, 3, 5 }.Aggregate((r, i) => r – i); -14 (((9 – 4) – 11) – 3) - 5
Vorteile oder Nachteile von Linq ● Es ist nicht möglich komplett mit Linq zu programmieren, da es nur für Listen unterschiedlicher Art zur Verfügung steht. ● In den benötigten C# Teilen treten Seiteneffekte auf. ● Nachteile: ● Keine unendlichen Listen ● Bei zu großen Listen Stackoverflow Exception
Fazit Linq ist noch nicht ausgereift aber die Verwendung kann sich durchaus lohnen.
Quellen DownloadArticle.aspx?id= LINQ-Samples-3fb9811b de-de/library/bb aspx /03/third-party-linq-providers.html