C# 自定义类:用于实现与LINQ正常工作的接口
我经常使用LINQ查询、修改和管理自定义类的列表(或词典) 例如,碰巧Contains方法给了我一个奇怪的结果,最终我发现它希望实现IEquatable接口,以便正确理解对象实际上在列表中 您是否有一个接口列表,我的类应该实现这些接口,以便与所有典型的LINQ构造(如Discinct、Contains等)配合使用C# 自定义类:用于实现与LINQ正常工作的接口,c#,linq,interface,C#,Linq,Interface,我经常使用LINQ查询、修改和管理自定义类的列表(或词典) 例如,碰巧Contains方法给了我一个奇怪的结果,最终我发现它希望实现IEquatable接口,以便正确理解对象实际上在列表中 您是否有一个接口列表,我的类应该实现这些接口,以便与所有典型的LINQ构造(如Discinct、Contains等)配合使用 谢谢 您可以重写类上的Equals方法。如果不重写Equals,则Distinct和Contains(etc)将检查两个项目是否都是对同一对象的引用。您可能希望它识别具有相同属性的两个
谢谢 您可以重写类上的
Equals
方法。如果不重写Equals
,则Distinct
和Contains
(etc)将检查两个项目是否都是对同一对象的引用。您可能希望它识别具有相同属性的两个不同对象
另一个选项是创建另一个实现
IEqualityComparer
的类,该类执行T
的两个实例的比较。这样做的好处是您不必修改原始类。此外,还可以定义不同的比较器,以便在一次比较中,两个类相等,但在另一次比较中,它们不相等。只有当您希望应用该IEqualityComparer
时,才可以使用它。您可以在类上重写Equals
方法。如果不重写Equals
,则Distinct
和Contains
(etc)将检查两个项目是否都是对同一对象的引用。您可能希望它识别具有相同属性的两个不同对象
另一个选项是创建另一个实现
IEqualityComparer
的类,该类执行T
的两个实例的比较。这样做的好处是您不必修改原始类。此外,还可以定义不同的比较器,以便在一次比较中,两个类相等,但在另一次比较中,它们不相等。您只在希望应用时才使用该IEqualityComparer
。IEquatable
应该是确定一个实例是否等于另一个实例所需的全部内容
如果计划将类型用作散列集合的键(如
字典
或哈希表
),则必须重写对象.GetHashCode()
和对象.Equals(对象)
。即使您没有这样做,这仍然是一个好主意,因为如果您已经实现了IEquatable
,并且覆盖了object.Equals(object),那么覆盖object.Equals是微不足道的
还要求重写GetHashCode
。IEquatable
应该是确定一个实例是否等于另一个实例所需的全部内容
如果计划将类型用作散列集合的键(如字典
或哈希表
),则必须重写对象.GetHashCode()
和对象.Equals(对象)
。即使您没有这样做,这仍然是一个好主意,因为如果您已经实现了IEquatable
,那么重写object.Equals
是微不足道的,而重写object.Equals(object)
也需要重写GetHashCode
。您不需要只重写Equals()
您还必须重写GetHashCode()
您不仅需要重写Equals()
您还必须重写GetHashCode()