C# 我应该实现IEquatable还是IComparable?

C# 我应该实现IEquatable还是IComparable?,c#,.net,C#,.net,我有课。这个类所代表的东西是这样的,我们可以说这些东西是相等的,我们也可以提出一个方案来对它们进行排序,以便进行比较 然而,很少有人觉得有必要对这些事物进行排序,但经常需要检查这两个事物是否相等 因此,我可以为我的类实现IEquatable,也可以实现IComparable。虽然IComparable提供了一些额外的功能,但不太可能有人会关心这些额外的功能。无论是从逻辑上还是从功能上看,这两者都没有明显的优势 我应该实现哪个接口,IEquatable,IComparable,或者两者都实现?为什

我有课。这个类所代表的东西是这样的,我们可以说这些东西是相等的,我们也可以提出一个方案来对它们进行排序,以便进行比较

然而,很少有人觉得有必要对这些事物进行排序,但经常需要检查这两个事物是否相等

因此,我可以为我的类实现
IEquatable
,也可以实现
IComparable
。虽然
IComparable
提供了一些额外的功能,但不太可能有人会关心这些额外的功能。无论是从逻辑上还是从功能上看,这两者都没有明显的优势

我应该实现哪个接口,
IEquatable
IComparable
,或者两者都实现?为什么?(我特别想知道框架范围内的影响)

答案是相似的,但答案只是简单明了,这对我没有帮助


如果你想知道,这个类是用来表示一个核苷酸的。核苷酸可以很容易地等同,但它们也可以进行比较(例如,按字母顺序)。

您应该实现一个接口,为您提供您现在需要的东西。如果您后来发现
IComparable
是您需要的东西,那么就实现它


很难决定要做多少未来验证。但是,当添加额外的未来功能相对简单时,我总是选择不这样做。你可能会发现你从来都不需要
IComparable
,即使是一个很小的添加,它仍然需要维护和考虑。

我肯定会实现
IComparable
,但现在跳过
IComparable
/
IComparable


正如你所说,没有一种方法可以比较核苷酸。有人可能需要按字母顺序对它们进行比较,有人可能需要另一种方法对它们进行排序。我宁愿提供不同的实现来实现
IComparable
/
IComparable
本身。

这主要是基于观点的,但如果可比性不明显(如数字),我不会实现
IComparable
。例如,如果有人想对核苷酸进行排序,它可以提供自己的
IComparer
实现。作为一名图书馆作者,我会提供一组可能的
icomparaler
s,例如按照您所说的字母顺序对它们进行排序。

如果对象本身具有可比性,那么我会做额外的工作,并在
IEquatable
之上实现
IComparable
。作为类型的作者,您处于提供正确实现的最佳位置。将其留给另一个开发人员来实现会增加以下情况发生的可能性

  • 他们没有正确地进行比较。其他开发人员可能比您更不熟悉这些数据,因此更可能错过一些关键案例
  • 重复卡多。如果您不提供事实上的比较,那么每个开发人员都必须单独进行,从而导致代码重复

您是否有可能需要对它们进行排序?我知道你说过这不太可能,但是如果你把这个类交给其他人,你能想出他们需要排序的原因吗?我肯定有可能想出一个人为的方案,在这个方案中,人们可能需要按字母顺序对它们进行排序(以便生成具有良好格式的可读输出)或者可以根据一些生化特性(如质量)对它们进行分类。但这是人为的,如果我要实现
IComparable
,我就必须为很少使用的方法编写文档(没有它,方法将毫无用处)。如果其他开发人员都实现自己的比较,那么,该组织的沟通相当糟糕:-/@MattGreer谁说他们在同一家公司工作?也许这段代码会得到更广泛的应用,并且您会让不同公司的开发人员使用it@MattGreer可以肯定的是,在我的特殊情况下,其他开发人员(如果有的话)是“遥远未来的我”。@MattGreer“那么该组织的沟通相当糟糕”。换句话说,一个典型的组织。:-)没有非泛型的
IEquatable
,好像有,它只会匹配
Equals()
覆盖所有对象所具有的。也就是说,当一个人确实实现了
IEquatable
时,他必须总是适当地覆盖
Equals()
GetHashCode()
,所以你的观点是正确的。更重要的是,
IComparable
在清楚它的必要性之前是反未来的证明,因为如果以后对给定比较方法的需求与之不匹配,那么更改当前实现将是一个突破性的更改。