IComparable 仅以一种方式工作
假设您有一Employee堂课。在一个视图中,您要显示所有Employees按名称排序的视图-在另一个视图中按地址显示。您将如何实现?不使用IComparable,至少不是以任何惯用的方式。
IComparable 逻辑错误
通过调用使用该接口.Sort()。在显示Customer按名称排序的视图中,根本没有代码暗示如何进行排序。
另一方面,Customer该类假设如何使用它-在这种情况下,它将在按名称排序的列表中使用。
IComparable 隐式使用
与替代方案相比,很难看到在何处使用了比较逻辑,或者根本看不到。假设您使用标准IDE,并从Customer课堂开始,我将不得不
- 搜索所有引用
Customer - 查找列表中使用的那些引用
- 检查这些列表是否曾经拜访过
.Sort()它们
更糟的是,如果删除IComparable仍在使用的实现,则不会收到任何错误或警告。您将得到的唯一一件事就是在所有难以理解的地方出现错误的行为。
这些问题加在一起,加上需求不断变化
我之所以开始考虑这一点,是因为它对我来说是错的。我已经IComparable在我的应用程序中愉快地使用了两年了。现在,需求发生了变化,事物需要以两种不同的方式进行分类。已经注意到,遍历上一节中描述的步骤并不是一件有趣的事情。
问题
这些问题使我认为IComparable不如IComparer或.OrderBy(),以至于看不到任何其他替代方案无法更好地解决的有效用例。
使用IComparer或LINQ 总是更好吗,还是这里没有我看到的优点/用例?
IComparable它,这强化了我的观点。
SortedXXX集合,他们要么需要存储的元素是IComparable或有IComparer提供。另请注意,使用一个比较器逆转自然排序顺序并使其适用于所有IComparable对象是很简单的。
IComparable被认为是默认的比较机制。 IComparer当您要覆盖默认比较机制时使用。
ReverseComparer<T>:gist.github.com/jackfarrington/078e7af7bc82482aa634