Microsoft Word Amaliy atd ki att ax 4
Download 310.74 Kb. Pdf ko'rish
|
15-amaliy
A15. LINQda orderby, group so‘rovlarga doir masala yechish. orderby operatori va OrderBy metodi LINQ-da ma'lumotlar to'plamini saralash uchun siz orderby operatoridan foydalanishingiz mumkin: int[] numbers = { 3, 12, 4, 10}; var orderedNumbers = from i in numbers orderby i select i; foreach (int i in orderedNumbers) Console.WriteLine(i); orderby operatori saralash mezonini qabul qiladi. Bu holatda mezon sifatida sonning oʻzi olinadi. Dastur natijasi: 3 4 10 12 Agar raqamlar matematikada odatdagidek standart tarzda tartiblangan bo'lsa, u holda satrlar alifbo tartibiga qarab tartiblanadi: string[] people = { "Tom", "Bob", "Sam" }; var orderedPeople = from p in people orderby p select p; foreach (var p in orderedPeople) Console.WriteLine(p); // Bob Sam Tom orderby operatori oʻrnida OrderBy() metodidan ham foydalanish mumkin: OrderBy (Func OrderBy (Func Usulning birinchi versiyasi to'plam elementini parametr sifatida qabul qiluvchi va saralash uchun ishlatiladigan qiymatni qaytaradigan delegatni oladi. Ikkinchi versiya, shuningdek, IComparer interfeysini amalga oshirish orqali tartiblash tamoyilini o'rnatishga imkon beradi. Yuqoridagi misollarni OrderBy() metodi yordamida qayta yozamiz: int[] numbers = { 3, 12, 4, 10 }; var orderedNumbers = numbers.OrderBy(n=>n); foreach (int i in orderedNumbers) Console.WriteLine(i); string[] people = { "Tom", "Bob", "Sam" }; var orderedPeople = people.OrderBy(p=>p); foreach (var p in orderedPeople) Console.WriteLine(p); Murakkab ob’yektlarni saralash Murakkabroq misolni qarab chiqaylik. Aytaylik, tanlangan murakkab ob’yektlarni saralash talab etilgan boʻlsin. Bu holatda mezon sifatida ob’yekt sinfi xossalaridan foydalanishimiz mumkin: var people = new List { new Person("Tom", 37), new Person("Sam", 28), new Person("Tom", 22), new Person("Bob", 41), }; // orderby operatori yordamida var sortedPeople1 = from p in people orderby p.Name select p; foreach (var p in sortedPeople1) Console.WriteLine($"{p.Name} - {p.Age}"); // OrderBy metodi yordamida var sortedPeople2 = people.OrderBy(p => p.Name); foreach (var p in sortedPeople2) Console.WriteLine($"{p.Name} - {p.Age}"); record class Person(string Name, int Age); Oʻsish va kamayish tartibida saralash Sukut boʻyicha orderby operatori va OrderBy metodi oʻsish tartibida saralaydi. orderby operatorida oʻsish tartibida saralash ascending kalit soʻzi bilan va kamayish tartibida saralash descending kalit soʻzi bilan amalga oshiriladi. Masalan, massiv sonlarini kamayish tartibida saralashni amalga oshiramiz: int[] numbers = { 3, 12, 4, 10 }; var orderedNumbers = from i in numbers orderby i descending select i; foreach (int i in orderedNumbers) Console.WriteLine(i); // 12 10 4 3 Kamayish tartibida saralash uchun OrderByDescending() metodidan foydalanish mumkin, bu metod OrderBy metodi bilan bir xil ishlaydi, faqat saralash yoʻnalishi farq qiladi: int[] numbers = { 3, 12, 4, 10 }; var orderedNumbers = numbers.OrderByDescending(n => n); foreach (int i in orderedNumbers) Console.WriteLine(i); // 12 10 4 3 Bir nechta saralash mezonlari Murakkab ob'ektlar to'plamida ba'zida bitta emas, balki bir vaqtning o'zida bir nechta maydonlar bo'yicha saralash kerak bo'lgan vaziyat mavjud. Buning uchun LINQ soʻrovlarida barcha mezonlar prioritet tartibida vergul bilan koʻrsatiladi: var people = new List { new Person("Tom", 37), new Person("Sam", 28), new Person("Tom", 22), new Person("Bob", 41), }; // orderby operatori yordamida var sortedPeople1 = from p in people orderby p.Name, p.Age select p; foreach (var p in sortedPeople1) Console.WriteLine($"{p.Name} - {p.Age}"); Natija: Bob - 41 Sam - 28 Tom - 22 Tom - 37 Turli xil saralash mezonlari uchun siz yo'nalishni belgilashingiz mumkin: // orderby operatori yordamida var sortedPeople1 = from p in people orderby p.Name, p.Age descending //yosh boʻyicha kamayish tartibida saralash select p; Kengaytirilgan metodlar yordamida xuddi shularni ThenBy() (oʻsish tartibida) и ThenByDescending() (kamayish tartibida) metodlari bilan bajarish mumkin: var sortedPeople2 = people.OrderBy(p => p.Name).ThenByDescending(p=>p.Age); Natija avvalgilari bilan bir xil boʻladi. Saralash mezonlarini qayta aniqlash Agar mezonlar bizni qanoatlantirmasa, IComparer ni qoʻllash bilan biz saralash mezonlarini oʻzgartirishimiz mumkin. Masalan, satrlar sukut boʻyicha alifbo tartibida saralanadi. Agar bizda ularni uzunligi boʻyicha sarlash talab etilsa: string[] people = new[]{"Kate", "Tom", "Sam", "Mike", "Alice"}; var sortedPeople = people.OrderBy(p => p, new CustomStringComparer()); foreach (var p in sortedPeople) Console.WriteLine(p); // satr uzunligi boʻyicha taqqoslash class CustomStringComparer : IComparer { public int Compare(string? x, string? y) { int xLength = x?.Length ?? 0; // если x равно null, то длина 0 int yLength = y?.Length ?? 0; return xLength - yLength; } } IComparer interfeysida saralanayotgan ob’yektlar saralanayotygan ob’yekt tipiga moslashtiriladi (bu holatda String tipi bilan). Ushbu interfeys realizatsiyasini Compare metodi bilan aniqlash mumkin. Agar birinchi parameter ikkinchisidan katta boʻlsa 0 dan katta, kichik boʻlsa, 0 dan kichik qiymat qaytaradi. Agar ikkala parameter ham teng boʻlsa, 0 qiymat qaytaradi. Bu holatda agar parameter null boʻlsa, satr uzunligini 0 ga teng deb olamiz. В данном случае, если параметр равен null, будем считать что длина строки равна 0. Va ikkala parametrdan satrlar uzunligidagi farqdan foydalanib, qaysi biri kattaroq ekanligini aniqlaymiz. Natija: Tom Sam Kate Mike Alice Aniq bir parameter boʻyicha guruhlash uchun group by operatori va GroupBy() metodidan foydalaniladi. group by operatori Aytaylik, quyidagicha tipda ob’yektlar toʻplami berilgan: record class Person(string Name, string Company); Bu sinf foydalanuvchini ifodalaydi va ikkita xususiyatga ega: Ism (foydalanuvchi nomi) va Kompaniya (foydalanuvchi ishlaydigan kompaniya). Keling, foydalanuvchilar to'plamini kompaniya bo'yicha guruhlaymiz: Person[] people = { new Person("Tom", "Microsoft"), new Person("Sam", "Google"), new Person("Bob", "JetBrains"), new Person("Mike", "Microsoft"), new Person("Kate", "JetBrains"), new Person("Alice", "Microsoft"), }; var companies = from person in people group person by person.Company; foreach(var company in companies) { Console.WriteLine(company.Key); foreach(var person in company) { Console.WriteLine(person.Name); } Console.WriteLine(); } record class Person(string Name, string Company); Agar LINQ ifodasida tanlovni bajaradigan oxirgi operator group boʻlsa, u holda select operatori qoʻllanilmaydi. Group operatori guruhlash bajariladigan mezonni qabul qiladi: group person by person.Company Bu holatda guruhlash Company xossalari boʻyicha bajariladi. Group operatori natijasi guruhlardan tashkil topgan toʻplamdir. Har bir guruh IGrouping ob’yektini ifodalaydi: K parametri guruhlar bajariladigan kalit – xossa tipini koʻrsatadi (bu yerda string tipi). V parametri esa guruhlangan ob’yektlar tipini ifodalaydi, bu holatda Person ob’yektlarini guruhlaymiz. Har bir guruh Key xossasi orqali olishimiz mumkin boʻlgan kalitga ega: g.Key. Bu yerda u kompaniya nomi boʻladi. Guruh ichidagi barcha elementlarni qo'shimcha iteratsiya bilan olish mumkin. Guruh elementlari guruh operatoriga uzatilgan ob'ektlar turi bilan bir xil turdagi, ya'ni bu holda Person tipidagi ob'ektlar. Natija: Microsoft Tom Mike Alice Sam JetBrains Bob Kate GroupBy Shu bilan bir qatorda, siz GroupBy kengaytma metodidan foydalanishingiz mumkin. GroupBy Ushbu versiya to'plamning har bir elementini parametr sifatida qabul qiladigan va guruhlash mezonini qaytaradigan delegatni oladi.. Keling, oldingi misolni GroupBy metodi bilan qayta yozamiz: Person[] people = { new Person("Tom", "Microsoft"), new Person("Sam", "Google"), new Person("Bob", "JetBrains"), new Person("Mike", "Microsoft"), new Person("Kate", "JetBrains"), new Person("Alice", "Microsoft"), }; var companies = people.GroupBy(p => p.Company); foreach(var company in companies) { Console.WriteLine(company.Key); foreach(var person in company) { Console.WriteLine(person.Name); } Console.WriteLine(); // для разделения между группами } record class Person(string Name, string Company); Guruhlashda yangi ob'ekt yaratish Endi so'rovni o'zgartiramiz va guruhdan yangi ob'ekt yaratamiz: Person[] people = { new Person("Tom", "Microsoft"), new Person("Sam", "Google"), new Person("Bob", "JetBrains"), new Person("Mike", "Microsoft"), new Person("Kate", "JetBrains"), new Person("Alice", "Microsoft"), }; var companies = from person in people group person by person.Company into g select new { Name = g.Key, Count = g.Count() }; ; foreach(var company in companies) { Console.WriteLine($"{company.Name} : {company.Count}"); } record class Person(string Name, string Company); Bu yerda group person by person.Company into g ifoda guruhdan tarkib topgan g oʻzgaruvchisini aniqlaydi. Ushbu o'zgaruvchidan foydalanib, biz anonim turdagi yangi ob'ektni yaratishimiz mumkin (garchi bu vazifa uchun yangi sinfni aniqlash mumkin bo'lsa ham): select new { Name = g.Key, Count = g.Count() } Endi LINQ soʻrovi natijasi ikkita Name va Count xossasi boʻlgan anonim tipli ob’yektlar toʻplamini ifodalaydi. Natija: Microsoft : 3 Google : 1 JetBrains : 2 GroupBy() metodi yordamida: var companies = people .GroupBy(p=>p.Company) .Select(g => new { Name = g.Key, Count = g.Count() }); Ichki soʻrovlar Shuningdek, biz ichki so'rovlarni amalga oshirishimiz mumkin: Person[] people = { new Person("Tom", "Microsoft"), new Person("Sam", "Google"), new Person("Bob", "JetBrains"), new Person("Mike", "Microsoft"), new Person("Kate", "JetBrains"), new Person("Alice", "Microsoft"), }; var companies = from person in people group person by person.Company into g select new { Name = g.Key, Count = g.Count(), Employees = from p in g select p }; foreach (var company in companies) { Console.WriteLine($"{company.Name} : {company.Count}"); foreach(var employee in company.Employees) { Console.WriteLine(employee.Name); } Console.WriteLine(); } record class Person(string Name, string Company); Bu yerda har bir guruhning Employees xususiyati o‘sha guruhdagi barcha foydalanuvchilarni tanlaydigan qo‘shimcha so‘rov bilan yaratiladi. Dasturning konsol chiqishi: Microsoft : 3 Tom Mike Alice Google : 1 Sam JetBrains : 2 Bob Kate GroupBy metodi yordamida: var companies = people .GroupBy(p=>p.Company) .Select(g => new { Name = g.Key, Count = g.Count(), Employees = g.Select(p=> p) }); Foydalanish uchun adabiyot va manbalar: 1. Троелсен Эндрю, Джепикс Филипп. Язык программирования C# 7 и платформы .NET и .NET Core. Вильямс. 2018 2. A. Troelsen, P. Japikse. Pro C# 8 with .NET Core. Foundational Principles and Practices in Programming. Apress, 2020 3. Албахари Бен, Албахари Джозеф. C# 7.0. Справочник. Полное описание языка. Пер. с англ.-СПб: “Альфа-книга”, 2018, -1024 с. 4. https://metanit.com/sharp/tutorial/15.3.php 5. https://metanit.com/sharp/tutorial/15.6.php Download 310.74 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling