Ikkita to'plamning kesishmasi deb, bu to'plamlarning har ikkalasida ham mavjud bo'lgan elementlardan tuzilgan to’plamga aytilishini siz yaxshi bilasiz. LINQdagi Intersect metodi bizga ikkita to’plamning kesishmasini, ya’ni bu to’plamlarning har ikkoviga ham tegishli elementlarni olish imkoniyatini beradi.
Metod quyidagi ko'rinishda ishlatiladi:
var kesishma=Birinchi_toplam.Intersect(Ikkinchi_toplam);
Eslatma: A ∩ B = B ∩ A bo’lgani uchun to’plamlarning qaysi biri avval, qaysi biri keyin yozilishining umuman ahamiyati yo’q, baribir natija bir xil bo’ladi.
Intersect metodiga parametr sifatida kiritilayotgan to’plamlarning biri yoki ikkalasi null ga teng bo’lganida ArgumentNullExeption xatoligi yuzaga keladi.
Keling, soddaroq misol sifatida ikkita sonlar to’plamining kesishmasini olib ko’ramiz:
usingSystem;usingSystem.Linq;classdotnetuz{publicstaticvoidMain() {int[] A = { 1,2,5,13,4,7,9 };int[] B = { 0,2,5,7,8,9,10,11 };int[] C =A.Intersect(B).ToArray();foreach (int item in C) {Console.WriteLine(item); }Console.ReadKey(); }}
Natija:
2
5
7
9
Ko'rib turganimizdek, dastur ishlashi natijasida to'plamlarning har ikkalasida mavjud bo'lgan elementlargina ekranga chiqarildi.
Endi bu metodni bitta classga tegishli obyektlar ustida ishlatib ko’raylik.
Keling, bitta hayotiy masala qo’yamiz: Aytaylik, o’quv markazida ikki xil kurs bor. Bu kurslarga qatnashayotgan o’quvchilarning alohida ikkita ro’yxati berilgan va har ikkala kursga ham qatnashuvchi o’quvchilarni ajratib berishimiz so’ralgan bo’lsin. Bu masalani LINQdan foydalanib hal qilib ko’ramiz.
Buning uchun, an’anaga sodiq qolgan holda qo’shimcha bitta Comparer sinf yaratib olamiz (aslida qanday nom berish ixtiyoringiz), va unga IEqualityComparer interfeysini implementatsiya qilib, Equals() va GetHashCode() metodlarini qayta yozib olamiz:
publicclassPupil {publicstring Name { get; set; }publicstring SurName { get; set; } }classPupilComparer:IEqualityComparer<Pupil> { // Ismi ham, familiyasi ham bir xil o'quvchilarni bitta o'quvchi deb hisoblaymizpublicboolEquals(Pupil x,Pupil y) { //Obyektlar ikkalasi bitta havolaga murojaat qilayotganini tekshiramizif (Object.ReferenceEquals(x, y)) returntrue; // Obyekt null emasligini tekshiramizif (Object.ReferenceEquals(x,null) ||Object.ReferenceEquals(y,null))returnfalse; // Ikkala obyekt tengligini tekshirib, bir xil bo'lsa true qaytaramizreturnx.SurName==y.SurName&&x.Name==y.Name; } // Agar Equals() metodi biror juftlik uchun true qiymat qaytarsa, GetHashCode() metodi // ham bu juftlik uchun aynay bir xil HashCode qaytarishi kerak:publicintGetHashCode(Pupil pupil) { // Obyekt null ga teng emasligini tekshirib olamizif (Object.ReferenceEquals(pupil,null)) return0; // Name maydoni null bo'lmasa, uning Hesh-kodini olamizint hashPupilName =pupil.Name==null?0:pupil.Name.GetHashCode(); // SurName maydonining hesh-kodini olamizint hashPupilCode =pupil.SurName.GetHashCode(); // O'quvchining hesh-kodini hisoblaymizreturn hashPupilName ^ hashPupilCode; } }
To’liq kod quyidagicha bo’ladi:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;namespacecomparer{classdotnetuz {publicstaticvoidMain() {Pupil [] Maths={ newPupil {Name="Anvar", SurName="Aliyev"},newPupil {Name="Abduolim", SurName="Ahmadjonov"},newPupil {Name="Sarvar", SurName="Valijonov"},newPupil {Name="Diyorbek", SurName="Mamataliyev"},newPupil {Name="Ali", SurName="Salimov"},newPupil {Name="Ali", SurName="Ganiyev"} };Pupil[] Physics ={ newPupil {Name="Sarvar", SurName="Valijonov"},newPupil {Name="Abduolim", SurName="Ahmadjonov"},newPupil {Name="Diyorbek", SurName="Mamataliyev"},newPupil {Name="Ali", SurName="Hakimov"},newPupil {Name="Ali", SurName="Salimov"} };IEnumerable<Pupil> kesishma =Physics.Intersect(Maths,newPupilComparer());foreach (var pupil in kesishma)Console.WriteLine(pupil.Name+" "+pupil.SurName);Console.ReadKey(); } }publicclassPupil {publicstring Name { get; set; }publicstring SurName { get; set; } }classPupilComparer:IEqualityComparer<Pupil> { // Ismi ham, familiyasi ham bir xil o'quvchilarni bitta o'quvchi deb hisoblaymizpublicboolEquals(Pupil x,Pupil y) { //Obyektlar ikkalasi bitta havolaga murojaat qilmayotganini tekshiramizif (Object.ReferenceEquals(x, y)) returntrue; // Obyekt null emasligini tekshiramizif (Object.ReferenceEquals(x,null) ||Object.ReferenceEquals(y,null))returnfalse; // Ikkala obyekt tengligini tekshirib, bir xil bo'lsa true qaytaramizreturnx.SurName==y.SurName&&x.Name==y.Name; } // Agar Equals() metodi biror juftlik uchun true qiymat qaytarsa, GetHashCode() metodi // ham bu juftlik uchun aynay bir xil HashCode qaytarishi kerak:publicintGetHashCode(Pupil pupil) { // Obyekt null ga teng emasligini tekshirib olamizif (Object.ReferenceEquals(pupil,null)) return0; // Name maydoni null bo'lmasa, uning Hesh-kodini olamizint hashPupilName =pupil.Name==null?0:pupil.Name.GetHashCode(); // SurName maydonining hesh-kodini olamizint hashPupilCode =pupil.SurName.GetHashCode(); // O'quvchining hesh-kodini hisoblaymizreturn hashPupilName ^ hashPupilCode; } }}
Natija:
Sarvar Valijonov
Abduolim Ahmadjonov
Diyorbek Mamataliyev
Ali Salimov