Ienumerable va ienumerator interfeysi metodlarini sinfda qayta aniqlash
Ob’ektlarni saralash. IComparable interfeysi
Download 31.88 Kb.
|
IEnumerable va IEnumerator interfeysi metodlarini sinfda qayta aniqlash
Ob’ektlarni saralash. IComparable interfeysi
.NET darajasida o‘rnatilgan ko‘plab kollektsiyalar va massivlar saralashni qo‘llab-quvvatlaydi. Bitta usulda, odatda, Sort () deb ataladi. Masalan: int[] numbers = new int[] { 97, 45, 32, 65, 83, 23, 15 }; Array.Sort(numbers); foreach (int n in numbers) Console.WriteLine(n); Biroq, Sort usuli faqatgina int yoki string kabi primitiv turlar uchun ishlaydi. Murakkab ob’ektlarni saralash uchun IComparable interfeysi qo‘llaniladi. U faqat bir usulga ega: public interface IComparable { int CompareTo(object o); } CompareTo usuli joriy ob’ektni object o parametri sifatida o‘tkaziladigan ob’ekt bilan solishtirish uchun mo‘ljallangan. Chiqishda u uchta qiymatdan biri bo‘lishi mumkin bo‘lgan butun sonni qaytaradi: Noldan kichik. Demak, joriy ob’ekt parametr sifatida beriladigan ob’ektning oldida bo‘lishi kerak Nolga teng. Demak, ikki ob’ekt ham teng Noldan ko‘p. Demak, joriy ob’ekt parametr sifatida beriladigan ob’ektdan keyin bo‘lishi kerak Masalan, Person sinfi mavjud: class Person : IComparable { public string Name { get; set; } public int Age { get; set; } public int CompareTo(object o) { Person p = o as Person; if (p != null) return this. Name.CompareTo(p.Name); else throw New Exception (« Ikki ob’ektni solib bo‘lmadi »); } } Bu erda kelib chiqish mezoni sifatida Person ob’ektining Name xossasi tanlangan. Shuning uchun haqiqiy solishtirishda joriy ob’ektning Name xossasi va parametr orqali o‘tkazilgan ob’ektning Name xossalari o‘rnatilmoqda. Agar ob’ektni Person turiga keltirish mumkin bo‘lmasa, bundan tashqari chiqariladi. Qo‘llanilish: Person p1 = new Person { Name = "Bill", Age = 34 }; Person p2 = new Person { Name = "Tom", Age = 23 }; Person p3 = new Person { Name = "Alice", Age = 21 }; Person[] people = new Person[] { p1, p2, p3 }; Array.Sort(people); foreach(Person p in people) { Console.WriteLine($"{p.Name} - {p.Age}"); } IComparable interfeysi umumlashtirilgan versiyasiga ega, shuning uchun biz uni Person sinfida qoʻllashni qisqartirish va soddalashtirishimiz mumkin edi: class Person : IComparable {
Person ob’ektlarining komparatorini yaratamiz. Ushbu ob’ektlarni satr uzunligiga qarab solishName: class PeopleComparer : IComparer {
{ if (p1.Name.Length > p2.Name.Length) return 1; else if (p1.Name.Length < p2.Name.Length) return -1; else return 0; } } Ushbu holatda IComparer interfeysining umumlashtirilgan versiyasidan foydalaniladi. Komparator qo‘llanilmoqda: Person p1 = new Person { Name = "Bill", Age = 34 }; Person p2 = new Person { Name = "Tom", Age = 23 }; Person p3 = new Person { Name = "Alice", Age = 21 }; Person[] people = new Person[] { p1, p2, p3 }; Array.Sort(people, new PeopleComparer()); foreach(Person p in people) { Console.WriteLine($"{p.Name} - {p.Age}"); } Komparator ob’ekti Array.Sort () usulining ikkinchi parametri sifatida ko‘rsatiladi. Bunda Person sinfi IComparable interfeysini amalga oshiradimi yoki yo’qmi, muhim emas. Komparator tomonidan belgilangan saralash qoidalari katta ustuvor bo‘ladi. Boshida Person ob’ektlari yo‘lga qo‘yiladi, ularning nomlari kichik, oxirlari uzoq bo‘ladi: Tom - 23
Alice – 21 Download 31.88 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling