Taqqoslovchi ilova.
IComparable interfeysidan tashqari, .NET platformasi IComparer interfeysini ham taqdim etadi:
interface IComparer
{
int Compare(object o1, object o2);
}
Compare usuli ikkita o1 va o2 ob'ektlarini solishtirish uchun mo'ljallangan. Bundan tashqari, taqqoslash natijasiga qarab uchta qiymatni qaytaradi: agar birinchi ob'ekt ikkinchidan katta bo'lsa, u holda 0 dan katta raqam qaytariladi, agar kamroq bo'lsa, u holda raqam noldan kichikdir; agar ikkala ob'ekt teng bo'lsa, nol qaytariladi.
Keling, Person ob'yekt komparatorini yaratamiz. Ob'ektlarni satr uzunligiga - Name xususiyati qiymatiga qarab solishtirishga ruxsat bering:
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;
}
}
Bunday holda, keraksiz turdagi konversiyalarni oldini olish uchun IComparer interfeysining umumiy versiyasi qo'llaniladi. Taqqoslash ilovasi:
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}");
}
Taqqoslovchi ob'ekt Array.Sort() usulining ikkinchi parametri sifatida ko'rsatilgan. Person klassi IComparable interfeysini amalga oshiradimi yoki yo'qmi, muhim emas. Taqqoslovchi tomonidan o'rnatilgan tartiblash qoidalari ustuvor bo'ladi. Boshida kichikroq nomga ega bo'lgan Person ob'ektlari bo'ladi va oxirida - uzunroq nomga ega:
Tom - 23
Hisob-kitob - 34
Elis - 21
Do'stlaringiz bilan baham: |