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 OE-NIK HP 1 Haladó Programozás LINQ módszerek XML kezelés, XLINQ Feladat.

Hasonló előadás


Az előadások a következő témára: "V 1.0 OE-NIK HP 1 Haladó Programozás LINQ módszerek XML kezelés, XLINQ Feladat."— Előadás másolata:

1 V 1.0 OE-NIK HP 1 Haladó Programozás LINQ módszerek XML kezelés, XLINQ Feladat

2 V 1.0 OE-NIK HP 2 Haladó Programozás LINQ módszerek XML kezelés, XLINQ Feladat

3 V 1.0 OE-NIK HP 3 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

4 V 1.0 OE-NIK HP 4 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 (PROG3) Üzleti logika réteg (PROG1, PROG2) Adat (erőforrás) réteg (ADB)

5 V 1.0 OE-NIK HP 5 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 (eredetileg csak MS SQL-Server, de vannak kiterjesztések más szerverekhez is)

6 V 1.0 OE-NIK HP 6 Lambda kifejezések LINQ metódusokkal A paraméter részbe kerülhetnek lambda kifejezések Minden LINQ metódus –IEnumerable típushoz tartozó „extension method” –A metódusok paramétere egy T bemeneti típusú lambda kifejezés, amelynek a kimeneti típusa metódusonként más (pl. Where  szűrés  bool kimenet; OrderBy  sorrendezés  IComparable kimenet) –A lambda kifejezés minden gyűjtemény-elemre meghívódik –A kimeneti típusa tipikusan IEnumerable (néha: T, int) Adatbázisok esetén –azonos szintaxis, IQueryable extension methods –expression lambda  nem feltétlenül hívódik meg minden elemre  optimalizálható

7 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 var x = 6; var z = new Hallgato(); OE-NIK HP 7

8 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 (ideiglenes, apró, csak adatot összefogó osztályok helyett ) : var NévKorCím = new { Nev="Béla", Kor=23, Cim="Budapest Bécsi út 96/B" }; OE-NIK HP 8

9 V 1.0 OE-NIK HP 9 LINQ Gyűjtemények class Diak { public string Nev { get; set; } public int Kreditek { get; set; } public Diak(string ujnev, int ujkreditek) { Nev = ujnev; Kreditek = ujkreditek; } public override string ToString() { return Nev + " - " + Kreditek; }

10 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)); OE-NIK HP 10

11 V 1.0 OE-NIK HP 11 Használható operátorok 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 Rendezés: OrderBy – tetszőleges sorrend, Reverse – sorrend megfordítása 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

12 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  Konvertálható: eredmeny.ToArray(); eredmeny.ToList(); var uj = elso.Reverse(); foreach (var akt in uj) { Console.Write(akt + ", "); } Console.ReadLine();  3, 2, 1, 2, 8, 6, 4, 2 OE-NIK HP 12

13 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); OE-NIK HP 13

14 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); OE-NIK HP 14

15 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 == 1); –String tömb, a négy betűs nevek: int num = strtomb.Count(x => x.Length == 4); OE-NIK HP 15

16 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 => { if (x.Kreditek<=1) return false; 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 OE-NIK HP 16

17 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(); OE-NIK HP 17

18 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 OE-NIK HP 18

19 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()}; OE-NIK HP 19

20 V 1.0 OE-NIK HP 20 Haladó Programozás LINQ módszerek XML kezelés, XLINQ Feladat

21 V 1.0 XML emlékeztető (w3schools.com) Hierarchikus adatleíró formátum XML deklarációk + elemek + attribútumok –Elemek:, = –Attribútumok: -ban category=„…” … 21 Everyday Italian Giada De Laurentiis Learning XML Erik T. Ray

22 V 1.0 XML emlékeztető Felépítését szigorú szabályok korlátozzák –Első sor: opcionális formátumspecifikáció, kiegészíthető karakterkódolással: –Mindegyik elemnek lehet: Szöveges tartalma Alelemei Attribútumai, amelyek az adott elemhez adnak meg tulajdonságokat –Kötelezően kell lennie egy gyökérelemnek, ami az egész dokumentumot közrefogja ( elem) –Minden elem lezárása kötelező ( vagy ) Az egymásba ágyazás lezárásainak megfelelő sorrendben kell történniük Rosszul formázott: Jól formázott: 22

23 V 1.0 XML emlékeztető – attribútum vs. alelem Bár szabály nincs rá, de a józan ész elvei szerint kell használni az attribútumokat és a gyerekelemeket. Ez a megoldás szintaktikailag helyes lenne, de nem ésszerű: Javaslat: attribútum csak kivételes esetben, legtöbbször csak az id=„0001", ami alapján az elemek azonosíthatók 23

24 V 1.0 XML emlékeztető – szabályok A kis- és nagybetűk különbözőek Az attribútumok jelzésénél kötelező az idézőjel vagy az aposztróf Speciális karakterek helyett entity-ket használunk: OE-NIK HP 24 KarakterEntity << >> && ‘' ""

25 V 1.0 XML emlékeztető – szabályok A szöveges tartalmakban a szóköz karakterek megmaradnak Sorvégjel: linux/unix szerű \n (\r nem kell, de a legtöbbször nem gond) Tag-névben lehet szám és betű is, de többnyire csak az angol ABC betűit használjuk –Lehetőleg legyen rövid –Space nem használható, inkább _ –Pont, kötőjel, kettőspont nem javasolt, inkább _ –Szám nem lehet a név elején –DTD/Schema készíthető: „well formed” vs „valid” Az XML kiegészíthető: új tag bevezetése nem teszi tönkre az eddig használt feldolgozó programokat OE-NIK HP 25

26 V 1.0 OE-NIK HP 26 XML +.NET XmlReader, XmlWriter –Gyorsak, kevés memóriát fogyasztanak –Csak előrefelé tudnak dolgozni –Bonyolult az összetett xml-ek megírása –Az xml-transzformáció borzasztó tud lenni (node csere, node változtatás, etc) XmlDocument, XmlNode, XmlElement, Xml* –Lassú, sokat fogyaszt (a memóriában felépíti a teljes dokumentum fáját) –Ezzel sem feltétlenül egyszerűek az algoritmusok –Előnyös, ha transzformálni akarunk

27 V 1.0 X* osztályok Cél: –Gyors –Letisztult –XML eszközök támogatása (XQuery, XSLT) –XPath helyettesítése XDocument, XElement, XAttribute, XDeclaration, X* –Átláthatóbban írhatunk XML-t C#-ban (és más.NET-nyelveken) –System.Xml.Linq névtér –Automatikusan stringgé alakulnak (tagekkel együtt!) –A tényleges tartalom (Value) feldolgozásához kasztolni kell OE-NIK HP 27

28 V 1.0 XElement A konstruktor flexibilis (params kulcsszó)  szinte bármilyen XML létrehozható akár egyetlen konstruktorhívással var xe = new XElement("ember", "Joe"); Joe var xe2 = new XElement("ember", new XElement("név", "Joe"), new XElement("kor", 25)); Joe 25 OE-NIK HP 28

29 V 1.0 XAttribute Konstruktorral: var xe = new XElement("ember", new XAttribute("id", 43984), new XElement("név", "Joe"), new XElement("kor", 25)); Utólag: var xe2 = new XElement("ember", new XElement("név", "Joe"), new XElement("kor", 25)); xe2.SetAttributeValue("id", 43984); OE-NIK HP 29 Joe 25

30 V 1.0 XDocument mentése XDocument outDoc = new XDocument( new XElement("nép", new XElement("ember", new XAttribute("id", 0), new XElement("név", "Joe"), new XElement("kor", 22)), new XElement("ember", new XAttribute("id", 1), new XElement("név", "Quagmire"), new XElement("kor", 34)))); outDoc.Save("people.xml"); Egyénre szabható: outDoc.WriteTo(…) + XmlWriter OE-NIK HP 30

31 V 1.0 Egyszerű adatfeldolgozás string nev = xDoc.Element("emberek").Element("ember").Element("név").Value; int id = int.Parse(xDoc.Element("emberek").Element("ember").Attribute("id").Value);... VAGY... (nem csak attribútum, hanem elem esetén is) int id = (int)(xDoc.Element("emberek").Element("ember").Attribute("id")); OE-NIK HP 31 Joe ….Element(name).Attribute(name).Elements(name).Attributes(name)

32 V 1.0 LINQ to XML X* osztályok: igen erős LINQ-támogatás! –LINQ-zható IEnumerable -ként kapunk vissza egy csomó adatot Pl. XElement xe2: –xe2.Descendants() minden gyerekelem (gyerekelemek gyerekelemei is) –xe2.Descendants("note") ilyen nevű gyerekelemek (gyerekelemek gyerekei is) –xe2.Elements() közvetlen gyerekelemek –xe2.Elements("note") ilyen nevű közvetlen gyerekelemek –xe2.Attributes(), xe2.Ancestors() … OE-NIK HP 32

33 V 1.0 LINQ to XML XDocument XDoc =... var q = from x in XDoc.Root.Descendants("ember") where x.Element("név").Value.StartsWith("Jo") select x; OE-NIK HP 33 Joe …

34 V 1.0 OE-NIK HP 34 Haladó Programozás LINQ módszerek XML kezelés, XLINQ Feladat

35 V 1.0 XDocument betöltése XDocument inDoc = XDocument.Parse(stringWithFullXML); XDocument inDoc = XDocument.Load("Joe.xml"); XDocument XDoc = XDocument.Load ("http://users.nik.uni-obuda.hu/hp/people.xml"); Dr. Vámossy Zoltán Alkalmazott Informatikai Intézet egyetemi docens, mb. intézetigazgató-helyettes, TDK- felelős +36 (1) BA.3.12 OE-NIK HP 35

36 V 1.0 Példa Listázzuk azokat, akik nem a BA épületben dolgoznak (String adatokkal dolgozunk – mindig konvertálni kell a valódi típusra, ha ez nem megfelelő (typecasting))! XDocument XDoc = XDocument.Load( "http://users.nik.uni-obuda.hu/hp/people.xml"); var q0 = from akt in XDoc.Descendants("person") let room=akt.Element("room").Value where !room.StartsWith("BA") select akt; foreach (var akt in q0) { Console.WriteLine(akt.ToString()); } OE-NIK HP 36

37 V 1.0 Feladatok Az XElement osztály az.Element() és az.Attribute() metódusaival olvasható... Ezek segítségével importáljuk az XML-t egy listába! 1.Határozzuk meg az AII intézetben dolgozók darabszámát! 2.Az AII dolgozóit listázzuk „lapozva”, 15 elemenként kelljen ENTER-t leütni 3.Jelenítsük meg azokat, akiknek a harmadik emeleten van irodája! 4.Kiknek van a leghosszabb vagy legrövidebb nevük? 5.Határozzuk meg intézetenként a dolgozók darabszámát! 6.Határozzuk meg a legnagyobb intézetet! 7.Listázzuk a legnagyobb intézet dolgozóit! 8.Listázzuk a harmadik legnagyobb intézet dolgozóit szobaszám szerint csökkenő sorrendben! OE-NIK HP 37

38 V 1.0 OE-NIK HP 38 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 Fülöp Dávid XLinq prezentációja Linq to XML in 5 minutes: Access XML data using Linq: development/access-xml-data-using-linq-to-xml/594 Simple XML parsing examples: XML: Reiter István: C# jegyzet (http://devportal.hu/content/CSharpjegyzet.aspx), 224. oldal (A könyv az XMLReader/Writer, illetve az XmlDocument használatát mutatja be)

39 V 1.0 OE-NIK HP 39

40 40 OE-NIK HP


Letölteni ppt "V 1.0 OE-NIK HP 1 Haladó Programozás LINQ módszerek XML kezelés, XLINQ Feladat."

Hasonló előadás


Google Hirdetések