Interfeys toifalari tushunchasi Interfeys toifalarni abstract bazaviy sinflar bilan taqqoslash Maxsus interfeyslarni kiritish


var nomTavs = from p in mahsulotlar select


Download 0.77 Mb.
bet49/50
Sana26.01.2023
Hajmi0.77 Mb.
#1129439
1   ...   42   43   44   45   46   47   48   49   50
Bog'liq
MAVZULAR UMUMIY

var nomTavs = from p in mahsulotlar select
new { p.Nomi, p.Tavsifi };
foreach (var x in nomTavs)
{
// Nomi va Tavsifini bevosita ishlatish ham mumkin edi.
Console.WriteLine(x.ToString());
}
}//NomVaTavsifiniOlish

Bu metodni Main() metodidan chaqirish quyidagi natijaga olib lkeladi:


Nomlar va Tavsiflar:
{ Nomi = Kofe Pele, Tavsifi = Braziliya, 100 gr. }
{ Nomi = Nestle, Tavsifi = Sut, 1 litr }
{ Nomi = Avedov, Tavsifi = Pista yog'i, 1 litr }
{ Nomi = Hydrolife, Tavsifi = Suv, 10 litr }
{ Nomi = Fanta, Tavsifi = Ichimlik, 1.5 litr }
{ Nomi = Premium, Tavsifi = Plitka shokolad, 100 gram }

Shuni unutmasligingiz lozimki, LINQ so’rovi proyekstiyani ishlatganida, uning asosida yotgan ma’lumotlarning toifasini aniqlashning biror bir imkoni yo’q, chunki u kompilyatsiya bosqichida aniqlanadi. Shu bois bunday hollarda var kalit so’zini ishlatish majburiydir. Undan tashqari, nooshkor toifalangan qiymat qaytaruvchi metodlarni yaratish mumkin emas. Shu bois quyidagi metod kompilyatsiya bo’lmaydi:


static var ProyektsiyaQisminiOlish(MahsulotInfo[] mahsulotlar)
{
var nomiTavs = from p in mahsulotlar select new { p.Nomi, p.Tavsifi };
return nomiTavs; // Bu mumkin emas!
}
Agar proyekstiya qilingan ma’lumotlarni chaqiruv nuqtasiga qaytarish lozim (zarur) bo’lsa, yondashuvlarning biri LINQ so’rovi natijasini System.Array ob’yektiga ToArray() kengaytiruvchi metodidan foydalangan holda transformatsiya qilishni, ya’ni boshqa turga (toifaga) keltirishni nazarda tutadi. Masalan, ushbu metodni Main() metodidan chaqirish mumkin:
// Endi qaytariluvchi qiymat Array ob'yektidir
static Array ProyektsiyaQism(MahsulotInfo[] mahsulotlar)
{
var nomTavs = from p in mahsulotlar
select new { p.Nomi, p.Tavsifi };
// Anonim ob'yektlar to'plamini Array ga aks ettirish
return nomTavs.ToArray();
}//ProyektsiyaQism


Main() dan quyidagicha chaqiriladi:

Array objs = ProyektsiyaQism(omborTovarlari);


foreach (object о in objs)
{
Console.WriteLine(о); //ToString() metodini har bir
//anonim ob'yekt uchun chaqiradi
}
Ko’rib turganingizdek, bu yerda System.Array ob’yekti bevosita ishlatilishi kerak, bu yerda C# dagi massivni e’lon qilish sintaksisini qo’llash mumkin emas, chunki proyektsiya asosida yotgan toifa noma’lum, zero gap kompilyatorning o’zi generatsiya qiladigan anonym sinf haqida bormoqda. Undan tashqari umumlashgan ToArray() metodi uchun ham toifa parametri ko’rsatilmayapti, chunki u ham kompilyatsiya bosqichiga qadar noma’lum. Bu joyda qat’iy toifalashtirishning yo’qotilishi muammosi ko’zga tashlanadi, chunki Array ob’yektining har bir elementi Object toifasiga mansubdir. Shunga qaramay, proyektsiyalash natijasida olingan LINQ so’rovining natijasini qaytarish lozim bo’lib qolsa, Array (yoki boshqa Enumerable toifasi a’zolarini ifodalovchi boshqa mos konteyner ) toifasiga transformatsiya qilish majburiydir.

Download 0.77 Mb.

Do'stlaringiz bilan baham:
1   ...   42   43   44   45   46   47   48   49   50




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling