You are on page 1of 13
Lucrarea $ ~ Instrumentul LINQ Resurse necesare '* Sistem de calcul dotat cu sistemul de operare Windows 10 sau Windows 7 in configuratia monitor, mouse, tastaturd; ‘* Mediu de dezvoltare Visual Studio 2019 sau Visual Studi6'20] Peinstalat. Obieetive '* Studiul celor mai utilizate metode ale instrurhentului LINQ; ‘+ Exemplificarca utilititii metodelén, existente in cadrul instrumentului LINQ. Instrumentul LINQ Instrumental de interogafe intégrat in}mediul de dezvoltare Visual Studio poarta numele de LINQ (Language-Integtated Query — Limbaj integrat de interogare) si ‘cumuleazii un set de tehnologii bazate pe integrarea interogirilor direct in limbajul C#. 0 interogare reprezinti o expresie bare permite manipularea datelor, Marele avantaj oferit de instrumentul LINQ prin introducerea interogirilor este reprezentat de minimizarea codului scris pentru implGifientarea unor operatii de baza. Clasele si fiterfetele asociate acestui instrument sunt integrate in namespace-ul SystemLing gare este inclus in System.Core. in cele ce urmeazi sunt prezentate exemple de utilizare ale metodelor LINQ. Cele mai utilizate metode sunt: 1. Select() utilizata pentru selectia unei anumite proprietati: OrderBy() folositi pentru ordonarea crescdtoare a elementelor unei_ structuri enumerabile; 3. OrderByDescending() folositi pentru ordonarea descrescitoare a elementelor unei structuri enumerabile; 4, Where() utilizata pentru filtrarea datelor pe baza unei conditiis FirstOrDefault() si LastOrDefault) pentru preluarea primului, respectiv awultimului clement care indeplineste 0 anumita conditie; 6. SingleOrDefauli() folosita pentru a identifica daca un singur element din structurdi indeplineste 0 anumiti cond 7. ElementAt() pentru preluarea unui element de pe pozitia’Speeificatd, 8. Take(n) pentru extragerea primelor n elemente dito structuta enumerabi 9, Skip(n) pentru omiterea primelor n elemente dintr-orstructura enumerabila; 10, Any() verified daca cel putin un element indeplinegte’o anumita conditie; 11. AIO verifica daca toate elementele div’Sthucturd indeplinese o anumita conditie; 12. Comtains() filtreaza elementele sisle pAstteazi doar pe cele care contin expresia speciticaté: 13, Count() nun ite elemehi@\indeplinese conditia mentionatii 14, Average() calculeazi.niedidlaritmeticd a clementelor dintr-o structura enumerabili; 15.Sum( caleuleaza Sima elementelor structuri; 16. Max() si Min() identifi€3 valoarea maxima, respectiv minima, din structur; 17.Reverse(*ifiversedza elementele din structura enumerabili (deci le citeste in Oglindayy \Se consideri vectorul x cu 5 element ale cérui valori se citese de la tastaturd, for (int i= 0; 1< 53 i++) t Console.Write("x["+i+ "| ="); x[il = int.Parse(Console.ReadLine()); Problema 1: Sa se verifice daci toate elementele dintr-un vector sunt numere pare, ys bool rezultat = x.AMl(c => (c % 2 Console. WriteLine(rezultat); in acest exemplu se parcurg toate elementele vectorului si se verificd daca elemeffUleurent este un numir par. Dacd in cadral acestei parcurgeri, se identific’ o valoareimpatiiatunci valoarea variabilei rezultat va fi false. in caz contrar, rezultatul va fi true. Figura 5.1 prezinta un exemplu in care toate elementele vectonutifisuntynimere pare, ceea ce va determina afisarea valorii ¢rue. in figura 5.1b esteyprezehiat un exemplu in care nu toate numerele sunt pare, iar prin urmare se va afig Yaloarea false. Wl Microsoft Visual Studio! x0] ht] »(2] xB] xl] True 2 a ° 8 10 a) ») Fig. 5.1. Metoda AUI(/aplicatd unui vector pentru a decide daci toate elementele sunt pare: a) ExemphuffGaré se afigeaz ‘rue pentru cd toate elementele sunt pare; b) Exemplu inearé se afigeaza false pentru ci nu toate elementele sunt pare. Protilema 2: Sa se verifice daci cel putin un element dintr-un vector este un numar par. bool rezultat = x.Any(e => (¢ % 2 Console. WriteLine(rezultat); Oy In figura 5.2 este prezentat un exemplu in care vectorul x confine elementele [123 5 7], in care cel putin un element este numar par. Prin urmare, in figura 5.2 se poate observa ca rezultatul are valoarea frue. Daca toate elementele vectorului ar fi avut valori impare, atunci valoarea afigati ar fi fost false. BB Microsor vis (0) - 111 [2] 1 [4] = False 1 3 5 7 9 a) by Fig. 5.2. Metoda Any() aplicati unui vector pentru a decide daca céf/putin unul dintre clemente este par: a) Exemplu in care se afiseazii true pentru 5 elementul de pe pozitia 2 este par; b) Exemplu in care se afigeaza false pentra(@a in Vector ft exista un element par. Problema 3: Sa se calculeze media aritmeticd a elementelor vectorului x double avg = x.Average(); Console, WriteLine(avg); Figura 5.3 prezinti rezultatul exeotitici pentru vectorul cu valorile [1 2.3 4 5] pentru care media aritmetica are valoarea 8. I Microsoft visua Fig. 5.3. Metoda Average) aplicata unui vector pentru a calcula media aritmetica: Problema 4: Sa se verifice daca vectorul x cu elemente de tip intreg contine valoarea 7. bool contine_valoare = x.Contains(6); Console. Wri Pentru vectorul [1 3 67 8], rezultatul afigat are valoarea true, doarece in acest vector exist valoarea 6. Rezultatul executiei este prezentat in figura 5.4, Aceasta problema poate fi rezolvati si cu ajutorul metodei Any() bool contine_valoare = x.Contains(6); Console. Writel ine(contine_valoare); BB Microsoft Visual [2] (1) [2] (31 [4] Fig, 5.4, Metoda Contains() aplicata unui vector pentru.a.idemtifica daca unul dintre elemente are valoarea 6) Problema §. Si se numere cate elemente dintt-ufyector cu elemente de tip intreg sunt numere pare, int nr_elem_pare = x.Count(¢=> (@% 2 = 0); Console. Writel ine(nr_elem_ pate); in variabila nr_elem pare deslérat’ de tip intreg este depus rezultatul numaratorii clementelor care indepliniesc Conditia de paritate specificata, respectiv © % 20. Pentrywéetonih{ 2 3.4 6], rezultatul afigat este 3, deoarece numai valorile 2, 4 si 6 respect conditia de paritate, aspect care poate fi observat si in figura 5.5, 1 Nicrosott Visual x(2] = xi] x12] xi] x[a] = 3 Fig.5.5. Exemplu de executie pentru contorizarea elementelor pare dintr-un vector Problema 6: Sa se afigeze elementul de pe pozitia 2 din vectorul x cu elemente numere intregi Console. WriteLine("Elementul de pe pozitia 2 este: " + x.ElementAt(2)); -mentul cu vajoarea 5. in figura 5.6 se poate observa cf elementul de pe pozifia 2 este Il Mcrocor vicua Studio Debug Console xfel = 1 x{1] = 3 xL2] xB] xia] Elenentul de pe pozitia 2 este: 5 Fig. 5.6, Rezultatul accesirii elementilai de pe poviia 2 Problema 7: Se cere si se afigeze elementul cu-valoare maxima si elementul cu valoare minima din vectorul x. Pentru rezolvare se vor utiliza urmatodtele sBevente de cod Console. WriteLine(""Valoarea. maxima este: " + x.Max()); Console. WriteLine("Valoarea minima este: " + x.Min(); Considerand vectorul x cu elementele [4 2 7 4 6], rezultatul obtinut in urma executiei va fi 2 pentru valoarea fninimi $7 pentra valoarca maximi, dupa cum se arat& in figura 5.7. IB Microsoft Visual Studio Deb, xtol = 4 kin = 2 el) = 7 xl - 4 kia = 6 Valoarea maxina este: 7 Valoarea minina este: 2 Fig. 5. Rezultatul afisarii valorii maxime gi minime dintr-un vector. Problema 8. Si se inverseze elementele vectorului x. Pentru implementare se utilizeazé metoda Reverse() care va inversa elementele unui vector. Console, WriteLine("Vectorul inversat este: " + string.Join(" ", x.Reverse())); Considerdnd vectorul x cu elementele [4 2 7 4 6], rezultatul obtinut va fi (6 4 7 2 4] dupa cum se arati in figura 5.8. 1 Microsoft Visual Stusio Debug Console ix(a} = 4 Kr) [21 kei} ila} = 6 jectorul inversat este: 64724 Fig, 5.8. Rezultatul inversirii elementelor unui@ector folosind metoda Reverse(). Problema 9. Se cere si se afigeze valoarea maxima dupe au fost omise primele 3 valori din vector. Console, WriteLine("Valoarea maxima este; " #x,Skip(3).Max(); Considerand vectorul x cu elementele [427 4 6], prin aplicarea metodei Skip(3), sunt ‘omise valorile [4 2 7] din vectorul x, amandnd valorile [4 6]. Dintre aceste valori, valoarea maxima care se va afisa Ya fi 6, dupa cum se arata in figura 5.9. 1 Wicieso% Visual Stuio Deus Console xo] = 4 Heit) = 2 p(2) -7 Kia) = 4 Kal = 6 Naloarea maxima este: 6 9eAfisarea valorii maxime dintr-un vector pentru care au fost omise primele trei elemente. Problema 10, Se cere si se afigeze elementele cu valoarea mai mare decat 5. De asemenea, se cere si se afigeze elementele cu indexul mai mare decit 3, Console. WriteLine("Elementele mai mari deat $ din vector sunt: " + string.Join(" ",x,Where(e => (c > 5))))5 In acest exemplu se poate observa ca pentru vectorul x s-a aplicat filtrarea prin conditia Where(c => (c > 5)) cu ajutorul cdreia sunt preluate din vectorul x toate elementele cu valoarea mai mare decat $ Considerand vectorul x cu valorile [9 2 8 1 5], filtrarea va evalua fiecare element prin intermediul variabilei c. De fiecare data cind aceasta variabila curenta are o valoarea mai mare deedt 5, se va adiuga in rezultatul retumat de metoda Where(). Astfel, rezultatul fumnizat va fi [9 8], dupa cum se arata in figura 5.10. Pentru filtrarea prin adaugare de conditie pe index se utilizeaza sintaxa: Console. WriteLine("Elementele cu index mai mare decat 2 din yeCtor Sunt: " + string.Join(" ", x.Where((c, i) => (i> 2))))s In acest exemplu, filtrarea este pusi pe index, prin scrierea expliciti a expresiei lambda: x. Where((c, i) => (I> 2)), unde c reprezinta valoared curenta, iaf Freprezinta indexul elementului din vector. Considernd acelasi exemplu, unde x are valorile [9 2 8 U5], fltrarea cu conditie pe index va elimina valorile cu incgii 0, 1 si 2, AStf@l, rezultatul obsinut va fi [1 5], dupa cum, se arata in figura 5.10. IB Microsoft visual Studia Debug Console [0] = 9 (1] = 2 [2] = 8 [3] = 1 [4] = 5 [Elenentele mai mari decat 5 din vector sunt: 9 8 lElewentele cu index mai mane decat 2 din vector sunt: 15 Fig, 50. Exemplu de aplicare conditie pe elemente si exemplu de aplicare conditie pe index (pozitie in vector). Aplicat 1. Se cere sa se creeze 0 aplicatia care citeste din fisierul mume_produse.txt creat in laboratorul numdrul 2. Sa se afiseze toate produsele al ciror pret este mai mic de 2000 lei. Pentru implementare, se vor parcurge urmatoarele etape: - Se extrag toate produsele sub forma unui vector de string-uri in variabila denumita produse; ~ Se extrag toate prequrile sub forma unui vector de string-uri in variabila denumita pret; = Se construieste un vector numit pocitiePreturiConditie cu pozitiile in cate S-aib identificat preturi cu valoarea mai mic decat 2000; = Se construieste un vector numit produseConditie cu produselé allate Pe pozitiile existente in yectorul pozitiePreturiConditie; - Se afiseazi elementele din vectorul produseConditie. Codul care implementeaza etapele este: string[] produse = File.ReadAllLines( "% \facultate\idp\laborator\laborator_3\test\nume_produse.txt ef] preturi = File.Read AllLines(@"! \facultate\lap\laborator\laborator_3\test\pret_20_10.txt"); NumberFormatinfo nfi7 new NumberFormatInfo()s fi. NumberDecimalSeparator = "."; int[| pozitiePreturiConditie = pret Select((v, i) => new { valoar i}) v, poziti Wher e( Convert. ToDouble(x.valoare, nfi) < 2000) Select(c => e.pozitie) -ToArray; string|] produseConditie = produse -Where((produs, pozitie) => pozitiePreturiConditie.Contains(povitie)) ToArray(s Console. WriteLine(stringJoin("\rin", produseConditie)); 2. Se cere si se creeze 0 aplicatia care eiteste din fisicrul mume_produse.txf creat in laboratorul numarul 2, Sa se afigeze cate produse au procesoare 13, Pentru implementare, se vor parcurge urmatoarele etape ~ Se extrag toate produsele sub forma unui vectorde string-uri fh variabila denumita produse; - Se numard clementele pentru care numele produslui curent s& contind expresia i3, Codul care implementeaza etapele este: string]] produse = File ReadAllLines(@"E:Mfacultate\ldp\laborator! "% int produse_i3 = produseCount(c=> c.Contains("i3")); Console, WriteLine("Numarul de produse este: " + produse_i3); borator_S\test\nume_produse.txt 3. Se cere si se FEZ aplicatia care citeste din figierul mume_produse.txt creat in Iaboratgrul nuimarul 2. Stiind ed pe o pagina pot fi afigate 4 elemente, se cere si se afigeze protlisele corespunzitoare unei pagini introduse de utilizator de la tastatura. Pentru implementare, se vor parcurge urmatoarele etape: + Se extrag toate produsele sub forma unui vector de string-uri in variabila denumité produse; ~ Se citeste de la tastaturd numarul paginii pentru care se doreste extragerea produselor; - Daca pentru numarul paginii introduse de catre utilizator exist& produse in vectorul produse, atunci se construieste vectorul eu patru elemente incepand cu pagina 4* (pagina - 1) si se afigeaz’ noul vector ; - in 2. contrar, se va afisa mesajul Nu exista atatea produse. Codul care implementeaza etapele este: string|] produs: File.ReadAllLines(@’ ” Console, Write("Inserati pagina ="); int pagina = int.Parse(Console.ReadLine(); if (4 * (pagina - 1)) < produse.CountQ) { \facultate\idp\laborator\laborator_3\test\inume_produse.txt string[] produseCurente = produseSkip(4 * (pagina - 1)).Take(4).ToArray(); Console. WriteLine(string.Join("\rin", produseCurente)); else Console. WriteLine("Nujexista atatea produse"); 4, Se cere(Sa se\bredze o aplicatia care citeste din fisierele nume_produse ereat in laboratortibintimarul 2. Se cere si se afigeze primele 5 produse cu cele mai mici preturi Pentru implementare, se vor parcurge urmitoarele etape: + Se extrag toate produsele sub forma unui vector de string-uri in variabia denumita produse; ~ Se extrag toate preturile sub forma unui vector de elemente in variabila denumita preturi, ~ Se ereeazi o listi cu elemente de tip cheie ~ valoare, pentru care cheia reprezint& numele produsului, iar valoarea reprezint& pretul asociat produslui. in acespfel, dupa construirea structutii, se va putea apela metoda OrderBy() care.perinite. ordonarea cresciitoare a elementelor din list dupa valoarea elementelor, leci dupa pret. Cheia va fi de tip string, in timp ce valoarea va trebui si fede tip double pentru a putea realiza corect sortarea erescétoare; ~ Se ordoneaza elementele dupa valoare; = Se afiseazi primele 5 produse din lista Codul care implementeaza descrierea anterioaGeste: List> kvp= new List>(); for (int i= 0; i < produse.Count); B+) kyp.Add(new KeyValtiePair(produse.ElementAt(i), Convert. ToDouble(pret.BlementAt(i, nfi))); var lista = kyp.OrderBy(c 5>e.Value); Console, WriteL ine(string.Join("\r\n", lista.Select(c => ¢.Value).Take(5))); Console, WriteLine(string.Join("\rin", lista.Select(c => e.Key).Take(5))); Rezuftatul execufiet’celor trei aplicatii este prezentat in figura 5.11 I Select Microsoft Visual Studio Debug Console 5. Laptop Gaming HP Pavilion 16-280579q cu pre 12. Laptop HP 25@ G8 cu proceson Intel Core I$ 21. Laptop HP 255 G7 15.6 FullH, AMD Ryzen 3: 26. Laptop 2 in 1 HP ENVY x360 15-ec0912nn cu 438. Laptop ultraportabil HP Pavilion 14-dvee34 38. LaptopHP 15s-fq2¢10ng cu procesor Intel cc 42. Laptop Ganing HP Pavilion 15-dkiling cu £ 44. Laptop 2 in 1 HP EW 1360 15-ed1019nN cu 50. Laptop Gaming HP ONEN 15-ek19a9nq cu proce Numarul de produse este: 11 Inserati pagina - 15 57. Laptop Gaming HP Pavilion 17-cd2023nq cu p 58. Laptop HP 250 G7 cu procesor Intel Core is 59. Laptop HP Pavilion 15-eg0072nq cu procesor 60. Laptop utrapartabil HP Pavilion Laptop 14. 1199 549,99 1550 1599,99 179,99 12, Laptop HP 250 G8 cu procesor Intel Core 26. Laptop 2 in 1 HP ENVY x360 15-ec0912nn cu 211 Laptop HP 255 G7 15.6 FulIMD, AxD Ryzen 3 5. Laptop Gaming HP Pavilion 16-20057nq cu pre 38. LeptopHP 15s-fa2610nq cu procesor Intel Cc Fig. 5.11, Rezultatul executiéitelor 3-aplicatii care afigeaza: produsele cu prefuri sub 2000 de lei, numirul de produse ei procesoare 3, produsele aferente paginii 15 atunci cand pe o pagina sefigeaz®)eate 4 produse si primele 5 cele mai ieftine produse.

You might also like