Created
October 7, 2025 10:33
-
-
Save sunmeat/cee959bb26917800acd428c25a4f805c to your computer and use it in GitHub Desktop.
IComparer example C#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Text; | |
namespace Compare | |
{ | |
class Monster | |
{ | |
// класи-компаратори часто розміщують у тілі основного класу для інкапсуляції: доступ до приватних полів, видимість для клієнта (якщо public/internal) | |
public class NameComparer : IComparer<Monster> | |
{ | |
public int Compare(Monster? x, Monster? y) | |
{ | |
// перевіряє наявність об'єктів, кидає виняток при null (необхідно для безпечного порівняння) | |
if (x == null || y == null) | |
throw new ArgumentNullException("надати нормальні об'єкти, а не порожні посилання"); | |
// порівнює імена за допомогою String.Compare (враховує регістр, повертає від'ємне/нульове/додатне) | |
return string.Compare(x.Name, y.Name, StringComparison.OrdinalIgnoreCase); | |
} | |
} | |
public class AmmoComparer : IComparer<Monster> | |
{ | |
public int Compare(Monster? x, Monster? y) | |
{ | |
// перевіряє наявність об'єктів, кидає виняток при null (необхідно для безпечного порівняння) | |
if (x == null || y == null) | |
throw new ArgumentNullException("надати нормальні об'єкти, а не порожні посилання"); | |
// порівнює боєприпаси: 1 якщо x > y, -1 якщо x < y, 0 якщо рівні | |
return x.Ammo.CompareTo(y.Ammo); | |
} | |
} | |
private string name; | |
private uint health; | |
private uint ammo; | |
public string Name | |
{ | |
get { return name; } | |
} | |
public uint Health | |
{ | |
get { return health; } | |
set | |
{ | |
// валідація: ammo не може бути від'ємним | |
ammo = value > 0 ? value : 0; | |
} | |
} | |
public uint Ammo | |
{ | |
get { return ammo; } | |
set | |
{ | |
// валідація: ammo не може бути від'ємним | |
ammo = value > 0 ? value : 0; | |
} | |
} | |
public Monster(uint health, uint ammo, string name) | |
{ | |
Health = health; | |
Ammo = ammo; | |
name = name ?? throw new ArgumentNullException(nameof(name)); | |
} | |
public virtual void Passport() | |
{ | |
Console.WriteLine("Монстр {0} з здоров'ям = {1} та боєприпасами = {2}", Name, Health, Ammo); | |
} | |
} | |
class Program | |
{ | |
static void Main() | |
{ | |
Console.OutputEncoding = Encoding.UTF8; | |
Monster[] crowd = [ | |
new Monster(50, 50, "Кликун"), | |
new Monster(80, 30, "Хвостун"), | |
new Monster(40, 10, "Зубан") | |
]; | |
Console.WriteLine("До сортування:"); | |
foreach (Monster elem in crowd) elem.Passport(); | |
Console.WriteLine("\nСортування за іменем:"); | |
Array.Sort(crowd, new Monster.NameComparer()); | |
foreach (Monster elem in crowd) elem.Passport(); | |
Console.WriteLine("\nСортування за боєприпасами:"); | |
Array.Sort(crowd, new Monster.AmmoComparer()); | |
foreach (Monster elem in crowd) elem.Passport(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment