我正在寻找现实世界的最佳实践,其他人可能如何实施具有复杂领域的解决方案。
任何时候您考虑使用IEqualityComparer<T>
,停下来思考是否可以让该类来实现IEquatable<T>
反而。如果一个Product
应始终按 ID 进行比较,只需将其定义为相等,以便您可以使用默认比较器。
也就是说,您可能需要自定义比较器的原因仍然有一些:
- 如果有多种方式可以将类的实例视为相等。最好的例子是字符串,框架为其提供了六个不同的比较器StringComparer.
- 如果该类的定义方式无法将其定义为
IEquatable<T>
。这将包括其他人定义的类和编译器生成的类(特别是匿名类型,默认情况下使用属性比较)。
如果您确实决定需要一个比较器,那么您当然可以使用通用比较器(请参阅DMenT的答案),但如果您需要重用该逻辑,则应该将其封装在一个专用类中。您甚至可以通过从通用基类继承来声明它:
class ProductByIdComparer : GenericEqualityComparer<ShopByProduct>
{
public ProductByIdComparer()
: base((x, y) => x.ProductId == y.ProductId, z => z.ProductId)
{ }
}
就使用而言,您应该尽可能利用比较器。例如,而不是调用ToLower()
在用作字典键的每个字符串(其逻辑将散布在您的应用程序中)上,您应该声明字典以使用不区分大小写的StringComparer
。对于接受比较器的 LINQ 运算符也是如此。但同样,始终要考虑可等同的行为是否应该是类固有的,而不是外部定义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)