System.IEquatable
این interface شما رو موظف می کنه که یک متد به نام Equals را به کلاستون اضافه کنید. وظیفه ی این متد اینه که مقایسه کنه که آیا شی شما با شی دیگری برابر هست یا خیر. این interface ناخودآگاه ما رو به یاد اینترفیس System.IComparableمیندازه.
مزیت این اینترفیس اینه که به دیگر کلاس ها اجازه ی جستجو کردن اعضای از جنس این کلاس را به شکل دلخواه ما میده. برخی کلاس ها مانند List یا ArrayList به واسطه ی همین
interface در بین اعضای لیست خود جستجو می کنند. مثلا List<T>.Contains ، List<T>.IndexOf و List<T>.Remove برای جستجو به سراغ همین interface می روند.

در زیر نمونه کدی را در این مورد مشاهده می کنید:

public class Student:IEquatable<Student>
{
public string Name;
public string Course;
public float Score;

public Student(string Name,string Course,float Score)
{
this.Name = Name;
this.Course = Course;
this.Score = Score;
}

public bool Equals(Student other)
{
if (this.Name == other.Name)
return true;
else
return false;
}

public override bool Equals(object other)
{
if (other == null)
return false;
if (!(other is Student))
throw new InvalidCastException("The argument is not a Student object.");
else
return Equals(other as Student);
}

public override int GetHashCode()
{
return this.Name.GetHashCode();
}

public static bool operator ==(Student student1, Student student2)
{
return student1.Equals(student2);
}

public static bool operator !=(Student student1, Student student2)
{
return (!student1.Equals(student2));
}
}
این interface مسائل حاشیه ای زیاد داره.
یکی اینکه اگه یک Equal برای کلاس خودمون ساختیم، یکی هم برای مقایسه ی کلاس خودمون با object بسازیم. دیگری تعریق operator های == و =! هست. و مسئله ی سوم تعریف GetHashCode هست به خصوص برای دیکشنری ها(<Dictionary<TKey, TValue). برای بررسی دقیق تر موضوع می تونید به MSDN مراجعه کنید:
http://msdn.microsoft.com/en-us/library/ms131190.aspx