IComparable interfeysidan tashqari, .NET IComparer interfeysini ham taqdim etadi:
public interface IComparer {
int Compare(T? x, T? y);
}
Taqqoslash usuli ikkita o1 va o2 ob'ektlarini solishtirish uchun mo'ljallangan. Shuningdek, u taqqoslash natijasiga qarab uchta qiymatni qaytaradi: agar birinchi ob'ekt ikkinchisidan katta bo'lsa, u holda 0 dan katta raqam qaytariladi; agar kamroq bo'lsa, noldan kichik son; agar ikkala ob'ekt teng bo'lsa, nol qaytariladi.
Keling, Person ob'yektlarining komparatorini yaratamiz. Ob'ektlarni satr uzunligiga qarab solishtirishga ruxsat bering - Name xususiyatining qiymati:
class PeopleComparer : IComparer
{
public int Compare(Person? p1, Person? p2)
{
if(p1 is null || p2 is null)
throw new ArgumentException("Некорректное значение параметра");
return p1.Name.Length - p2.Name.Length;
}
}
class Person
{
public string Name { get;}
public int Age { get; set; }
public Person(string name, int age)
{
Name = name; Age = age;
}
}
Bunday holda, keraksiz turdagi konversiyalarni oldini olish uchun IComparer interfeysining umumiy versiyasi qo'llaniladi. Taqqoslash ilovasi:
var alice = new Person("Alice", 41);
var tom = new Person("Tom", 37);
var kate = new Person("Kate", 25);
Person[] people = { alice, tom, kate};
Array.Sort(people, new PeopleComparer());
foreach (Person person in people)
{
Console.WriteLine($"{person.Name} - {person.Age}");
}
Taqqoslovchi ob'ekt usulning ikkinchi parametri sifatida ko'rsatilgan Array.Sort(). Person sinfi IComparable interfeysini amalga oshiradimi yoki yo'qmi, muhim emas. Taqqoslovchi tomonidan o'rnatilgan tartiblash qoidalari ustuvor bo'ladi. Boshida kichikroq nomli Person ob'ektlari, oxirida esa uzunroq ismlar bo'ladi:
Tom-37
Kate-25
Elis-41