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

Seb*_*idz 12 c# icomparer

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

一个.我们应该继承Comparer抽象类吗?要么

湾 我们应该实现IComparer接口.

优缺点都有什么?

m-y*_*m-y 13

我建议您扩展Comparer<T>类而不是实现IComparer<T>接口,Microsoft也是如此(请参阅下面的第一个参考资料).

现在,如果您希望对象本身(无论T是什么)能够与自身进行比较,它可以实现IComparable接口(请参阅下面的第二个参考).


来自:http://msdn.microsoft.com/en-us/library/8ehhxeaf ( v=vs.110IComparer<T> ) .aspx()

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

来自:http://msdn.microsoft.com/en-us/library/cfttsh47 ( v=vs.110Comparer<T> ) .aspx()

从这个类派生提供的自定义实现IComparer<T>与集合类等使用接口SortedList<TKey, TValue>SortedDictionary<TKey, TValue>泛型类.从Comparer类派生和实现System.IComparable接口之间的区别如下:

  • 要指定默认情况下应如何比较两个对象,请System.IComparable在类中实现该接口.这可确保排序操作将使用您提供的默认比较代码.
  • 要定义要使用的比较器而不是默认比较器,请从Comparer类派生.然后,您可以在将比较器作为参数的排序操作中使用此比较器.

  • 我意识到这一点,但阅读你的答案并不清楚你在说什么.我必须点击链接才能找到答案.你应该首先说_"我推荐`Comparer <T> Class` ..."_._ [你的答案在另一座城堡:什么时候答案不是答案?](http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an -answer - 不的回答)_ (4认同)