Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义类:用于实现与LINQ正常工作的接口_C#_Linq_Interface - Fatal编程技术网

C# 自定义类:用于实现与LINQ正常工作的接口

C# 自定义类:用于实现与LINQ正常工作的接口,c#,linq,interface,C#,Linq,Interface,我经常使用LINQ查询、修改和管理自定义类的列表(或词典) 例如,碰巧Contains方法给了我一个奇怪的结果,最终我发现它希望实现IEquatable接口,以便正确理解对象实际上在列表中 您是否有一个接口列表,我的类应该实现这些接口,以便与所有典型的LINQ构造(如Discinct、Contains等)配合使用 谢谢 您可以重写类上的Equals方法。如果不重写Equals,则Distinct和Contains(etc)将检查两个项目是否都是对同一对象的引用。您可能希望它识别具有相同属性的两个

我经常使用LINQ查询、修改和管理自定义类的列表(或词典)

例如,碰巧Contains方法给了我一个奇怪的结果,最终我发现它希望实现IEquatable接口,以便正确理解对象实际上在列表中

您是否有一个接口列表,我的类应该实现这些接口,以便与所有典型的LINQ构造(如Discinct、Contains等)配合使用


谢谢

您可以重写类上的
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()