Rozhraní IComparable, popř. strong-typed IComparable<T> slouží jako podpora pro porovnávání prvků, zejména pro jejich řazení (metody Sort). K implementaci je jediná instanční metoda CompareTo(), jejíž výsledek má být:
- nula, pokud jsou instance stejné (z hlediska porovnání rovnocenné),
- záporný, pokud je je instance (this) menší než parametr metody (při vzestupném řazení bude this dříve než parametr),
- kladný, pokud je instance (this) větší než parametr metody (při vzestupném řazení bude parametr dříve než this).
Tato konvence vyplynula z metodiky používané pro porovnávání čísel prostým odečtením this-param.
Dále musíme dodržet následující definiční pravidla, na která se často zapomíná:
- null < cokoliv jiného,
- null = null (neimplementuje se)
Samozřejmě taky všechna klasická pravidla:
- když A = B a B = C, tak A = C,
- když A < B a B < C, tak A < C,
- když A < B, tak B > A,
- …
Vzorová implementace obou rozhraní by pak mohla vypadat takto:
public class MyComparableClass : IComparable, IComparable<MyComparableClass>
{
// Strong-typed implementace IComparable<T>
public int CompareTo(MyComparableClass other)
{
if (other == null)
{
return 1;
}
// naše implementace srovnání, například
return this.Value.CompareTo(other.Value);
}
// Implementace IComparable
public int CompareTo(object obj)
{
if (obj == null)
{
return 1;
}
if (obj is MyComparableClass)
{
return CompareTo(obj as MyComparableClass);
}
throw new ArgumentException("obj musí být typu MyComparableClass", "obj");
}
}
Doporučuje se, aby třída, která implementuje IComparable, overridovala i metodu Equals.