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

时间:2014-11-02 10:53:25

标签: c# icomparer

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

一个。我们应该继承Comparer抽象类吗?或

湾我们应该实现IComparer接口。

有什么优点和缺点?

2 个答案:

答案 0 :(得分:12)

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

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


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

  

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

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

  

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

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

答案 1 :(得分:1)

来自this article on MSDN

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