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("Невозможно сравнить два объекта");
}
}
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‘llanilishi:
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
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person p)
{
return this.Name.CompareTo(p.Name);
}
}
Komparatordan foydalanish
IComparable interfeysidan tashqari .NET platformasi IComparer:
interface IComparer
{
int Compare(object o1, object o2);
}
Compare usuli ikki o1 va o2 ob’ektlarini taqqoslash uchun mo‘ljallangan. Shuningdek, u uchta qiymatni olib chiqish natijasiga qarab qaytaradi: birinchi ob’ekt ikkinchidan ko‘p bo‘lsa, soni 0 dan kam bo‘lsa, soni noldan kam bo‘ladi; agar ikkita ob’ektlar teng bo‘lsa, nol qaytadi.
Person ob’ektlarining komparatorini yaratamiz. Ushbu ob’ektlarni satr uzunligiga qarab solishtirilasi -Name xossasining qiymati bo'yicha:
class PeopleComparer : IComparer
{
public int Compare(Person p1, Person p2)
{
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
Bill - 34
Alice - 21
Do'stlaringiz bilan baham: |