Microsoft Word Amaliy atd ki att ax 4


Download 310.74 Kb.
Pdf ko'rish
Sana05.05.2023
Hajmi310.74 Kb.
#1430252
Bog'liq
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: 


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 keySelector) 
OrderBy (Func keySelector, IComparer? comparer); 
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 
Google 
Sam 
JetBrains 
Bob 
Kate 
GroupBy 
Shu bilan bir qatorda, siz GroupBy kengaytma metodidan foydalanishingiz 
mumkin.
GroupBy (Func keySelector); 


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