Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 1 Haladó Programozás Lambda kifejezések LINQ.

Hasonló előadás


Az előadások a következő témára: "V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 1 Haladó Programozás Lambda kifejezések LINQ."— Előadás másolata:

1 V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Lambda kifejezések LINQ

2 V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Lambda kifejezések LINQ

3 V 1.0 Szabó Zsolt, Óbudai Egyetem, Lambda kifejezések Cél: az írt kód lényeges lerövidítése (+ closures: működés egységbe zárása) Veszély: nagyon könnyen hozhatunk létre nehezen olvasható kódot Eddigi használat: 1) delegate deklarálása: típusok fixálása (be- és kimenet) delegate int del(int i); 2) anonymous metódus írása del negyzet = delegate(int x) { return x * x; }; 3) Eljárás meghívása int j = negyzet(5); //j = 25

4 V 1.0 Szabó Zsolt, Óbudai Egyetem, Lambda kifejezések Új operátor: => (Lambda operátor), a bemenet és a kimenet összekötésére használt Szintaxis: (paraméter[ek]) => kimenetet meghatározó kifejezés Lambda kifejezés használata: 1) delegate deklarálása: típusok fixálása delegate int del(int i); 2) delegate-hez változó hozzárendelése és lambda operátor del negyzet = (x) => x * x; 3) Eljárás meghívása int j = negyzet(5); //j = 25

5 V 1.0 Szabó Zsolt, Óbudai Egyetem, Lambda kifejezések delegate int del(int i, int j); del myDelegate = (x, y) => x + y; int j = myDelegate(5, 10); //j = 15 Delegate nélkül is használható: Func myFunc = (x) => x * x; int j = myFunc(5); //j = 25 Func myFunc2 = (x, y) => x + y; int j = myFunc2(5, 10); //j = 15 A paraméterek típusozása nem kötelező, csak speciális esetekben

6 V 1.0 Szabó Zsolt, Óbudai Egyetem, Lambda kifejezések Rekurzió: problémás: a változó definiálásához önmagát használom, de az adott változónak még nincs értéke Func Fakt = (x) => x == 1 ? 1 : x * Fakt(x - 1); // Use of unassigned variable Csúnya fix: Func Fakt = null; Fakt = (x) => x == 1 ? 1 : x * Fakt(x - 1);

7 V 1.0 Szabó Zsolt, Óbudai Egyetem, Lambda kifejezések A helyes rekurzióhoz rekurzív megvalósítású lambda delegate kell – a Funct nem ilyen. Rekurzív delegate: delegate int Recursive(Recursive r, int n); Funct -hoz hasonló rekurzív + generikus delegate: delegate KI Recursive (Recursive r, BE a); Recursive Fakt2 = (f, x) => x == 1 ? 1 : x * f(f, x-1); j = Fakt2(Fakt2, 5); //j = 120

8 V 1.0 Szabó Zsolt, Óbudai Egyetem, Lambda kifejezések A lambda kifejezések tényleges ereje a LINQ módszerekkel együttesen használva derül ki, ahol a paraméter részbe kerülhetnek lambda kifejezések int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; numbers.Where(n => n > 5);  Az ötnél nagyobbak listája numbers.Count(n => n % 2 == 1);  A páratlanok darabszáma Nézzük, hogy ez hogyan is történik…

9 V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Lambda kifejezések LINQ

10 V 1.0 Szabó Zsolt, Óbudai Egyetem, LINQ = Language Integrated Queries Gyűjtemények szintaktikailag egyszerű és forrásfüggetlen kezelése Szintaktikailag egyszerű: ciklusok és elágazások halmaza helyett lekérdező operátorokat használunk Forrásfüggetlen (MVC elv): teljesen mindegy, hogy a gyűjtemény adatforrása tömb, lista, XML, adatbázis – az eljárások ugyanazok Megjelenítés réteg (VEP) Üzleti logika réteg (OOP, PPT) Adat (erőforrás) réteg (ADB)

11 V 1.0 Szabó Zsolt, Óbudai Egyetem, LINQ to … ? LINQ To Objects: Memóriában lévő gyűjtemények, listák, tömbök feldolgozását teszi lehetővé (lényegében minden olyan osztállyal működik amely megvalósítja az IEnumerable interfészt). LINQ To XML: XML dokumentumok lekérdezését és szerkesztését teszi lehetővé. LINQ To SQL (DLINQ) és LINQ To Entities (Entity Framework, VS2008SP1): relációs adatbázisokon végezhetünk műveleteket (MS SQL-Server, de vannak kiterjesztések más szerverekhez is) Az első két típust a HP óra keretében tárgyaljuk Most: LINQ To Objects: listák, tömbök kezelése

12 V 1.0 Szabó Zsolt, Óbudai Egyetem, LINQ Gyűjtemények class diak { public string nev; public int kreditek; public diak(string ujnev, int ujkreditek) { nev = ujnev; kreditek = ujkreditek; } public override string ToString() { return nev + " - " + kreditek; }

13 V 1.0 LINQ Gyűjtemények int[] elso = new int[] { 2, 4, 6, 8, 2, 1, 2, 3 }; int[] masodik = new int[] { 1, 3, 5, 7, 1, 1, 2, 3 }; string[] strtomb = new string[] { "Béla", "Jolán", "Bill", "Shakespeare", "Verne", "Jókai" }; List diakok = new List (); diakok.Add(new diak("Első Egon", 52)); diakok.Add(new diak("Második Miksa", 97)); diakok.Add(new diak("Harmadik Huba", 10)); diakok.Add(new diak("Negyedik Néró", 89)); diakok.Add(new diak("Ötödik Ödön", 69)); Szabó Zsolt, Óbudai Egyetem,

14 V 1.0 Nyelvi elemek Lambda kifejezések: a programkód rövidítése miatt, hogy ne kelljen minden különféle szűréshez / sorrendezéshez / összegszámoláshoz külön delegate-et és metódust írni var típus (C#3-tól): egy metódusban deklarált változó típusának meghatározását a fordítóra bízzuk. Fontos lehet, ha annyira dinamikus az osztály, hogy fogalmunk sincs egy változó tényleges típusáról Kötelező egyből értéket rendelni a var típusú változóhoz, innentől az úgy fog viselkedni, mint az ekvivalens típus Szabó Zsolt, Óbudai Egyetem,

15 V 1.0 Nyelvi elemek Objektum inicializáló: ha van egy osztálynak nulla paraméteres konstruktora: diak bela = new diak() { kreditek = 23, nev = "Béla" }; Névtelen osztályok: var NévKorCím = new { nev="Béla", kor=23, cim="Budapest Bécsi út 96/B" }; Szabó Zsolt, Óbudai Egyetem,

16 V 1.0 Szabó Zsolt, Óbudai Egyetem, Használható operátorok Rendezés: OrderBy – tetszőleges sorrend, Reverse – sorrend megfordítása Halmaz-kezelés: Concat – egymás után másolás, Contains – elem meglétének vizsgálata, Distinct – ismétlések szűrése, Intersect – halmazelméleti metszet, Union – halmazelméleti únió, Except – Halmazelméleti különbség Szűrés: Where „Számolás” („Aggregate methods”, aggregáló eljárások): Average – átlag, Count – darabszám, Max – Maximum, Min – Minimum, Sum – Összeg Csoportosítás: GroupBy – valamilyen közös tulajdonság szerint lehet csoportosítani a tagokat Mi ezeket egyszerű tömbökön / listákon fogjuk használni

17 V 1.0 LINQ Operátorok 1. – Megfordítás Tegyük fel, hogy a gyűjtemény alaptípusa int[], és egyszerűen szűrünk/ megfordítunk  tudjuk, hogy a kimenet is int[] lesz Kimeneti típusnak EKKOR SEM HASZNÁLHATÓ int[], mert a meghívandó eljárás általánosan van megírva, ugyanaz az eljárás hívódik meg minden típusú gyűjteményre  Mindig IEnumerable vagy sima var típust használunk  Tömbbé konvertálható: uj.ToArray(); uj.ToList(); var uj = elso.Reverse(); foreach (var akt in uj) { Console.Write(uj + ", "); } Console.ReadLine();  3, 2, 1, 2, 8, 6, 4, 2 Szabó Zsolt, Óbudai Egyetem,

18 V 1.0 LINQ Operátorok 2. – Halmazok Elem létezésének vizsgálata: bool bennevan=elso.Contains(4); Két gyűjtemény egymás után fűzése (NEM halmazok!): var uj = elso.Concat(masodik); Ismétlődések kivágása (halmazzá alakítás): var uj = elso.Distinct(); Halmazelméleti metszet: var uj = elso.Intersect(masodik); Halmazelméleti únió: var uj = elso.Union(masodik); Halmazelméleti különbség var uj = elso.Except(masodik); Szabó Zsolt, Óbudai Egyetem,

19 V 1.0 LINQ Operátorok 3. – Sorrendezés OrderBy –Paraméterül egy olyan eljárást vár, amely egy osztályból kiszedi a kulcsot (azt a mezőt, ami alapján rendezni fog) (Ehelyett egy lambda kifejezést szokás írni) –Második paraméterként megadható neki egy saját, IComparer interfészt implementáló osztály, ami az összehasonlítást végzi –Int tömb, rendezés az elemek alapján: var uj = elso.OrderBy(x => x); –String tömb, rendezés az elemek hossza alapján: var uj = strtomb.OrderBy(x => x.Length); –Diákok listája, névsorba rendezés : var uj = diakok.OrderBy(x => x.nev); Szabó Zsolt, Óbudai Egyetem,

20 V 1.0 LINQ Operátorok 4. – Szűrés, darabszámolás Where / Count –A paraméterül adott kifejezésnek bool típust kell visszaadni. –A Where eredménye az a gyűjtemény, ahol ez true értéket ad vissza. A Count eredménye a darabszám (int!!) –A count meghívható paraméter nélkül is  teljes darabszám –Int tömb, a páratlanok: var uj = elso.Where(x => x % 2 == 0); –String tömb, a négy betűs nevek: int num = strtomb.Count(x => x.Length == 4); Szabó Zsolt, Óbudai Egyetem,

21 V 1.0 LINQ Operátorok 5. – Szűrés, részkiválasztás Diákok listája, csak név: var uj = diakok.Select(x => x.nev); Diákok listája, ahol a kreditszám prím: var uj = diakok.Where(x => { for (int i = 2; i <= Math.Sqrt(x.kreditek); i++) if (x.kreditek % i == 0) return false; return true; }); // Második Miksa - 97, Negyedik Néró - 89 Szabó Zsolt, Óbudai Egyetem,

22 V 1.0 LINQ Operátorok 6. – Több operátor Diákok listája, a páratlan kreditszámúak nagybetűs neve név szerinti fordított sorrendben: var uj = diakok.Where(x => x.kreditek%2==1). OrderBy(x => x.nev). Reverse(). Select(x => x.nev.ToUpper()); // ÖTÖDIK ÖDÖN, NEGYEDIK NÉRÓ, MÁSODIK MIKSA Ugyanaz az eredmény, ugyanaz a köztes kód: var uj = from x in diakok where x.kreditek % 2 == 1 orderby x.nev descending select x.nev.ToUpper(); Szabó Zsolt, Óbudai Egyetem,

23 V 1.0 LINQ Operátorok 7. – Aggregálás Aggregáló metódusok int ossz = elso.Sum(); //28 double atlag = masodik.Average(); //2.875 int parosOssz = elso. Where(x => x % 2 == 0).Sum(); //24 int paratlanOssz = elso. Where(x => x % 2 == 1).Sum(); //4 A fenti példa gyakori: valamilyen ismétlődés szerint akarom csoportosítani a gyűjteményemet, és az egyes csoportokra szeretném tudni a darabszámot/összeget Csoportonként egy where+aggregálás  zavaró  automata csoportosítás: GroupBy Szabó Zsolt, Óbudai Egyetem,

24 V 1.0 LINQ Operátorok 8. – Csoportosítás Csoportosítás, paritás szerinti darabszámok: var csoport=elso.GroupBy(x => x % 2); foreach (var g in csoport) { Console.WriteLine("Maradék: " + g.Key + ", darabszám: " + g.Count()); } var uj=from x in elso group x by x%2 into g select new {Maradek=g.Key, Darab=g.Count()}; Szabó Zsolt, Óbudai Egyetem,

25 V 1.0 Feladat A meteorológiai szolgálat szuperszámítógépe előrejelzéseket készít az egész országra vonatkozólag Az egyes előrejelzéseket az EloreJelzes osztály példányaiban tároljuk, az osztály adattagjai: dátum, régió {EszakNyugat, DelNyugat, EszakKozep, DelKozep, EszakKelet, DelKelet}, jelleg {Napos, KicsitFelhos, NagyonFelhos, Esos, Viharos}, minimum hőmérséklet, maximum hőmérséklet Generáljunk le véletlenszerűen a következő 100 nap előrejelzését Lehessen szűrni régióra, időpontra Mennyi a maximum és minimum hőmérséklet a 100 nap alatt; mennyi a keleti régiók átlaghőmérséklete; hány régióban lesz vihar Mennyi az egyes régiók átlaghőmérséklete; melyik régióban van a legtöbbször napos idő Szabó Zsolt, Óbudai Egyetem,

26 V 1.0 Szabó Zsolt, Óbudai Egyetem, Források Lambda expressions: Lambda expressions: Why use Lambda expressions: why-should-i-use-this Recursive lambda expressions: lambda-expressions.aspx Standard query operators: Linq introduction: 101 Linq samples: Lambda: Reiter István: C# jegyzet (http://devportal.hu/content/CSharpjegyzet.aspx), oldal Linq: Reiter István: C# jegyzet (http://devportal.hu/content/CSharpjegyzet.aspx), oldal

27 V 1.0 Szabó Zsolt, Óbudai Egyetem,

28


Letölteni ppt "V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 1 Haladó Programozás Lambda kifejezések LINQ."

Hasonló előadás


Google Hirdetések