4-amaliy ish. IComparable va ICloneable interfeysi metodlarini sinfda qayta aniqlash. .NET da o'rnatilgan yig'ish sinflari va massivlarining aksariyati tartiblashni qo'llab-quvvatlaydi. Odatda chaqiriladigan yagona usul yordamida Sort()siz darhol butun ma'lumotlar to'plamini o'sish tartibida saralashingiz mumkin. Masalan:
int[] numbers = new int[] { 97, 45, 32, 65, 83, 23, 15 };
Array.Sort(numbers);
foreach (int n in numbers)
Console.WriteLine(n);
// 15 23 32 45 65 83 97
Biroq, standart Saralash usuli faqat int yoki string kabi ibtidoiy turlar to'plami uchun ishlaydi. IComparable interfeysi murakkab ob'ektlar to'plamini saralash uchun ishlatiladi . Uning faqat bitta usuli bor:
public interface IComparable
{
int CompareTo(object? o);
}
Usul CompareTojoriy ob'ektni parametr sifatida uzatiladigan ob'ekt bilan solishtirish uchun mo'ljallangan object? o. Chiqishda u uchta qiymatdan biriga ega bo'lishi mumkin bo'lgan butun sonni qaytaradi:
Noldan kam. Bu joriy ob'ekt parametr sifatida uzatiladigan ob'ektdan oldin bo'lishi kerakligini anglatadi.
Nolga teng. Shunday qilib, ikkala ob'ekt tengdir
Noldan yuqori. Bu joriy ob'ekt parametr sifatida qabul qilingan ob'ektdan keyin bo'lishi kerakligini anglatadi
Masalan, Person klassi mavjud:
class Person : IComparable
{
public string Name { get;}
public int Age { get; set; }
public Person(string name, int age)
{
Name = name; Age = age;
}
public int CompareTo(object? o)
{
if(o is Person person) return Name.CompareTo(person.Name);
else throw new ArgumentException("Некорректное значение параметра");
}
}
Bu yerda taqqoslash mezoni sifatida Person obyektining Name xossasi tanlanadi. Shuning uchun taqqoslashda joriy ob'ektning Name xususiyatining qiymati va parametr orqali o'tgan ob'ektning Name xususiyati bu erda haqiqatda taqqoslanadi. Agar to'satdan ob'ektni Shaxs turiga o'tkazib bo'lmasa, istisno chiqariladi.
Ilova:
var tom = new Person("Tom", 37);
var bob = new Person("Bob", 41);
var sam = new Person("Sam", 25);
Person[] people = { tom, bob, sam};
Array.Sort(people);
foreach (Person person in people)
{
Console.WriteLine($"{person.Name} - {person.Age}");
}
Va bu holda, biz quyidagi konsol chiqishini olamiz:
Bob-41
Sem - 25
Tom-37
IComparable interfeysi umumiy versiyaga ega, shuning uchun biz uni Person sinfida ishlatishni qisqartirishimiz va soddalashtirishimiz mumkin:
class Person : IComparable
{
public string Name { get;}
public int Age { get; set; }
public Person(string name, int age)
{
Name = name; Age = age;
}
public int CompareTo(Person? person)
{
if(person is null) throw new ArgumentException("Некорректное значение параметра");
return Name.CompareTo(person.Name);
}
}
Xuddi shunday, biz yoshga qarab solishtirishimiz mumkin:
class Person : IComparable
{
public string Name { get;}
public int Age { get; set; }
public Person(string name, int age)
{
Name = name; Age = age;
}
public int CompareTo(Person? person)
{
if(person is null) throw new ArgumentException("Некорректное значение параметра");
return Age - person.Age;
}
}