IEquatable относиться к обобщенные интерфейсы. Этот интерфейс указываются по аналогии обобщенным классам.
Иногда нам необходимо сравнивать два экземпляра типа, допустим у нас есть класс Car с одинаковыми параметрами, цвета и марки автомобиля. Как в таком случаи найти 2 аналогичный автомобиля из списка? Для решения данной задачи могли бы просто переопределить Equals или оператор ==. Но это привело бы к замедлению работы программы, из за излишней упаковки значимых типов.
Для этих целей был придуман новый интерфейс IEquatable, позволяющий сравнить два значения без приведения типов и их проверки не прибегая к упаковке.
Пример 1. С реализацией IEquatable
using System;
using System.Drawing;
namespace ConsoleApp13
{
class Program
{
class Car:IEquatable<Car>
{
readonly string name;
readonly Color color;
public Car(string name, Color color)
{
this.name = name;
this.color = color;
}
public bool Equals(Car other)
{
if (this.color.Equals(other.color) && this.name.Equals(other.name))
return true;
return false;
}
}
static void Main(string[] args)
{
Car carOne = new Car("BMW",Color.Black);
Car carTwo = new Car("BMW", Color.Black);
Console.WriteLine(carOne.Equals(carTwo));
Console.ReadKey();
}
}
}
Пример 2 без реализации интерфейса
using System;
using System.Drawing;
namespace ConsoleApp13
{
class Program
{
class Car
{
readonly string name;
readonly Color color;
public Car(string name, Color color)
{
this.name = name;
this.color = color;
}
public override bool Equals(object obj)
{
Car car = obj as Car;
if (car != null)
{
if (this.color.Equals(car.color) && this.name.Equals(car.name))
return true;
}
return false;
}
}
static void Main(string[] args)
{
Car carOne = new Car("BMW",Color.Black);
Car carTwo = new Car("BMW", Color.Black);
Console.WriteLine(carOne.Equals(carTwo));
Console.ReadKey();
}
}
}
Таким образом с появлением обобщенных классов, появились и другие методы сравнения типов с помощью интерфейса IEquatable, позволяющий ускорить работу программы при сравнении, не прибегая к упаковки, распаковке.
