I'm trying to figure out which of these interfaces I need to implement. They both essentially do the same thing. When would I use one over the other?
I'm trying to figure out which of these interfaces I need to implement. They both essentially do the same thing. When would I use one over the other?
Well they are not quite the same thing as IComparer<T> is implemented on a type that is capable of comparing two different objects while IComparable<T> is implemented on types that are able to compare themselves with other instances of the same type.
I tend to use IComparable<T> for times when I need to know how another instance relates to this instance. IComparer<T> is useful for sorting collections as the IComparer<T> stands outside of the comparison.
Use IComparable<T> when the class has an intrinsic comparison.
Use IComparer<T> when you want a comparison method other than the class' intrinsic comparison, if it has one.
As others have said, they don't do the same thing.
In any case, these days I tend not to use IComparer. Why would I? Its responsibility (an external entity used to compare two objects) can be handled much cleaner with a lambda expression, similar to how most of LINQ's methods work. Write a quick lambda which takes the objects to compare as arguments, and returns a bool. And if the object defines its own intrinsic compare operation, it can implement IComparable instead.
IComparable says an object can be compared with another. IComparer is an object that can compare any two items.