c# - IComparable vs Equals() 对使用哪个感到困惑
问题描述
我有一个实现接口T
的类。T
我意识到我不能==
在对象上做,所以我Equals()
在我的代码中使用了方法:
return (Equals(_nodes[node.QueueIndex] , node));
但经过一番谷歌搜索后,我也找到IComparable
了一个选项,所以我也可以这样做:
return node.CompareTo(_nodes[node.QueueIndex]) >= 0;
我的接口在哪里继承IComparable
并实现它:
public int CompareTo(object obj)
{
return obj == this ? 1 : 0;
}
我真的很困惑哪种是正确的设计方法。它们实际上是否有不同的目的,哪一个是正确的选择?
解决方案
Equals
(or IEquatable
) 用于测试相等性。IComparable
用于测试大于、小于或等于。
存在测试相等性的情况,但没有直观的方法来比较它们。例如,ChessPiece
象棋游戏中的一个类。
我认为IComparable
这里不是一个好的选择,因为您实现的方式CompareTo
很尴尬:
public int CompareTo(object obj)
{
return obj == this ? 1 : 0;
}
您仍然只是在这里测试相等性,而不是实际比较对象。如果您可以编写一个CompareTo
不违反这些规则的适当方法,那么IComparable
是一个有效的选择。
在链接的这些规则中,您CompareTo
违反了此规则:
如果
A.CompareTo(B)
返回一个非零值,则B.CompareTo(A)
必须返回一个相反符号的值。
所以Equals
会更适合这里。
推荐阅读
- memory - 3D深度学习模型(pytorch)的高效推理
- r - How can I remove all rows that have NA for a certain variable
- python - Django: Admin - order results based on regular expression
- analytics - SPA DTM 分析页面名称问题
- php - Getting Issue In Gracenote TMSAPI
- curl - curl: (58) 无法加载 PEM 客户端证书,当证书在程序文件中时
- spring - 使用 Apache Camel 和 Hibernate 时的多租户支持(在 Spring 应用程序中)
- spring-boot - OAuth 2.0 身份验证显示 500 Internal Server Error, Spring Boot 微服务
- javascript - 按背景颜色进行文本剪辑
- excel - 您如何计算excel中两列集中相同数据集的出现次数?