我们应该扩展Comparer<T>还是实现IComparer<T>?

15

在编写比较器类时,从C# 4.0版本开始的最佳实践是什么:

a. 我们应该继承自Comparer抽象类吗?还是

b. 应该实现IComparer接口。

这样做的优缺点是什么?


实现 IComparer - mihai
我认为实现 IComparer 是更好的方式,因为它以后可能会在 LINQ 中使用。 - Marek Woźniak
从比较器继承。Msdn会告诉你为什么这样做。通过这样做,你将获得默认的比较器行为。 - Luis Filipe
1
@W92 Comparer<T> 实现了 IComparer<T> 和 IComparer 接口,因此您可以在 LINQ 中使用它。 - dotnetom
2个回答

15
我建议您扩展 Comparer<T> 类,而不是实现 IComparer<T> 接口,就像微软所做的一样(请参见下面的第一个参考文献)。
现在,如果您希望对象本身(无论 T 是什么)能够与自己进行比较,它可以实现 IComparable 接口(请参见下面的第二个参考文献)。
来自:http://msdn.microsoft.com/en-us/library/8ehhxeaf(v=vs.110).aspx (IComparer<T>)

我们建议您从Comparer<T>类派生,而不是实现IComparer接口,因为Comparer<T>类提供了IComparer.Compare方法和Default属性的显式接口实现,获取对象的默认比较器。

来自:http://msdn.microsoft.com/en-us/library/cfttsh47(v=vs.110).aspx (Comparer<T>)
从这个类派生以提供IComparer<T>接口的自定义实现,用于与集合类(例如SortedList<TKey, TValue>SortedDictionary<TKey, TValue>通用类)一起使用。 从Comparer类派生和实现System.IComparable接口之间的区别如下:
  • 要指定默认情况下如何比较两个对象,请在您的类中实现System.IComparable接口。这确保排序操作将使用您提供的默认比较代码。
  • 要定义一个替代默认比较器的比较器,请从Comparer类派生。然后,您可以在需要比较器作为参数的排序操作中使用此比较器。

“从这个类派生” - 指的是哪个类?我猜你是指 Comparer<T> 类? - user585968
这是对Comparer<T>的MSDN页面的直接引用,所以是的。 - myermian
4
我知道,但是读了你的回答后,不清楚你在说什么。我必须点击链接才能找出来。你应该先说:“我推荐使用Comparer<T>类...”。 您的答案在另一个城堡:何时回答才不是回答? - user585968

0

来自MSDN上的这篇文章

我们建议您从Comparer类派生,而不是实现IComparer接口,因为Comparer类提供了IComparer.Compare方法的显式接口实现和获取对象默认比较器的Default属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接