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