|
Mavzu: linq texnologiyasi va operatorlari
|
bet | 4/5 | Sana | 08.09.2024 | Hajmi | 22,68 Kb. | | #270591 |
Bog'liq 15-maruza. LINQ texnologiyalari va operatorlari.Murakkab filtrlar
Endi yanada murakkab filtrlarni ko'rib chiqamiz. Masalan, foydalanuvchi sinfida foydalanuvchi gapiradigan tillar ro'yxati mavjud. Agar biz foydalanuvchilarni tillar bo'yicha filtrlashimiz kerak bo'lsa:
1
2
3
4
5
|
var selectedUsers = from user inusers
from lang inuser.Languages
where user.Age< 28
where lang == "английский"
select user;
|
Natija:
Tom-23
Bob-27
SelectMany metodi kengaytma metodlaridan foydalangan holda o'xshash so'rov yaratish uchun ishlatiladi:
1
2
3
4
|
var selectedUsers = users.SelectMany(u => u.Languages,
(u, l) => new{ User = u, Lang = l })
.Where(u => u.Lang == "английский"&& u.User.Age < 28)
.Select(u=>u.User);
|
SelectMany ()metodi birinchi parametr sifatida proektsiyalanadigan ketma-ketlikni va ikkinchi parametr sifatida har bir elementga qo'llaniladigan transformatsiya funktsiyasini oladi. U foydalanuvchi tilidagi 8 juftlikni qaytaradi (yangi {User = u, Lang = l}), so'ngra qayerda filtrlanadi.
Loyihalash
Proyeksiya joriy tanlov turidan boshqa turini loyihalashga imkon beradi. Select operatori proyeksiya uchun ishlatiladi. Aytaylik, bizda foydalanuvchini ifodalovchi quyidagi sinf obyektlari to'plami mavjud:
1
2
3
4
5
|
classUser
{
publicstringName { get;set; }
publicintAge { get; set; }
}
|
Lekin bizga butun ob'ekt kerak emas, faqat uning Name xususiyati kerak:
1
2
3
4
5
6
7
8
|
List users = newList();
users.Add(newUser { Name = "Sam", Age = 43 });
users.Add(newUser { Name = "Tom", Age = 33 });
var names = from u inusers select u.Name;
foreach(stringn innames)
Console.WriteLine(n);
|
LINQ ifodasining natijasi qatorlar qatorini ifodalaydi, chunki u.Name ni tanlash ifodasi natija to'plamida faqat Name xususiyat qiymatlarini tanlaydi.
Xuddi shunday, siz boshqa turdagi, shu jumladan anonim ob'ektlarni yaratishingiz mumkin:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
List users = newList();
users.Add(newUser { Name = "Sam", Age = 43 });
users.Add(newUser { Name = "Tom", Age = 33 });
var items = from u inusers
select new
{
FirstName = u.Name,
DateOfBirth = DateTime.Now.Year - u.Age
};
foreach(var n initems)
Console.WriteLine($"{n.FirstName} - {n.DateOfBirth}");
|
Bu yerda select operatori joriy User obyekti yordamida noma'lum turdagi obyektni yaratadi. Va endi natija ushbu noma'lum turdagi ob'ektlar to'plamini o'z ichiga oladi, unda ikkita xususiyat aniqlanadi: FirstName va DateOfBirth.
Shu bilan bir qatorda biz Select() kengaytmasi metodidan foydalanishimiz mumkin:
1
2
3
4
5
6
7
8
9
|
var names = users.Select(u => u.Name);
var items = users.Select(u => new
{
FirstName = u.Name,
DateOfBirth = DateTime.Now.Year - u.Age
});
|
|
| |