问题 我们应该扩展Comparer 还是实现IComparer


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

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

湾我们应该实现IComparer接口。

优缺点都有什么?


1402
2017-11-02 10:53


起源

实行 IComparer - mihai
我认为,那个实施 IComparer 是更好的方法,因为它可能会在LINQ中使用。 - W92
继承自comparer。 Msdn告诉你为什么。通过这样做,您将获得default.comparer行为 - Luis Filipe
@ W92 Comparer <T>实现了IComparer <T>和IComparer,因此无论如何都可以使用LINQ - dotnetom


答案:


我建议你延长 Comparer<T> 类而不是实现 IComparer<T> 接口,Microsoft也是如此(参见下面的第一个参考资料)。

现在,如果你想让你的对象(无论是什么)能够与自己进行比较,它可以实现 IComparable 界面(见下面的第二个参考)。


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

我们建议您从中获取 Comparer<T> 类而不是实现IComparer接口,因为 Comparer<T> class提供了一个显式的接口实现 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类派生。然后,您可以在将比较器作为参数的排序操作中使用此比较器。

12
2017-11-02 11:00



“从这个班级中衍生出来” - 哪一堂课?我接受你的意思 Comparer<T>? - MickyD
这是MSDN页面上的直接引用 Comparer<T>,是的。 - m-y
我意识到这一点,但是阅读你的答案并不清楚你在说什么。我必须点击链接才能找到答案。你应该开始说 “我建议 Comparer<T> Class......”。 你的答案是在另一座城堡里:什么时候答案不是答案? - MickyD
@MickyDuncan:谢谢,完成了。 - m-y


这篇关于MSDN的文章

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


1
2017-11-02 11:03