Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created October 7, 2025 10:33
Show Gist options
  • Save sunmeat/cee959bb26917800acd428c25a4f805c to your computer and use it in GitHub Desktop.
Save sunmeat/cee959bb26917800acd428c25a4f805c to your computer and use it in GitHub Desktop.
IComparer example C#
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