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.