Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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# FirstOrDefault如何测试相等性?_C#_Linq_Equality - Fatal编程技术网

C# FirstOrDefault如何测试相等性?

C# FirstOrDefault如何测试相等性?,c#,linq,equality,C#,Linq,Equality,我有一个实现IEquatable接口的引用类型。我有一个包含单个对象的哈希集。然后,我创建了一个对象,根据IEquatable的标准,该对象与示例相同。但是,当我跑的时候 var equivalentEntry = _riskControlATMEntries[grouping.Key].FirstOrDefault(e => e == atmEntry); 在对象上,我得到null 另一方面,当我 var equivalentEntry = _riskControlATMEntries

我有一个实现IEquatable接口的引用类型。我有一个包含单个对象的哈希集。然后,我创建了一个对象,根据IEquatable的标准,该对象与示例相同。但是,当我跑的时候

var equivalentEntry = _riskControlATMEntries[grouping.Key].FirstOrDefault(e => e == atmEntry);
在对象上,我得到null

另一方面,当我

var equivalentEntry = _riskControlATMEntries[grouping.Key].FirstOrDefault(e => e.Equals(atmEntry));
根据IEquatable接口的实现,我得到了被认为相等的对象


那么,为什么哈希集依赖于
public bool Equals(ReferenceType other)
,而
FirstOrDefault
不依赖呢?
FirstOrDefault(e=>e==other)
中的
===
运算符在寻找什么相等?

FirstOrDefault
根本不比较相等项。您提供了一个筛选委托,该委托在一种情况下使用
=
操作符比较两个对象,在另一种情况下使用
Equals
方法


=
操作符执行类根据该类型定义的任何操作,如果未定义,则执行最接近的基本类型(其中
对象始终存在,如果没有更好的定义,则始终具有定义;它将根据对象的引用对对象进行比较)。好的设计要求您应该确保类的
=
操作符的行为定义与
Equals
方法完全相同,但语言中没有强制您这样做,显然这个类不能确保它们是相同的,毫无疑问,它会给您带来问题。

FirstOrDefault
根本不比较项目是否相等。您提供了一个筛选委托,该委托在一种情况下使用
=
操作符比较两个对象,在另一种情况下使用
Equals
方法


=
操作符执行类根据该类型定义的任何操作,如果未定义,则执行最接近的基本类型(其中
对象始终存在,如果没有更好的定义,则始终具有定义;它将根据对象的引用对对象进行比较)。好的设计要求您应该确保类的
=
操作符的行为定义与
Equals
方法完全相同,但语言中没有强制您这样做,显然这个类不能确保它们是相同的,不出意外,它会给您带来问题。

A
HashSet
只检查具有相同hashcode的项是否相等。您需要超越
GetHashCode
方法,并以一种方式实现它,使相等的对象返回相同的hashcode。@Knoop Ahhh得到了它。我认为它使用了Equals方法。我覆盖了Equals和GetHashCode。关于FirstOrDefault的等式比较,我的问题是什么?你也可以直接重载你感兴趣的操作符<代码>公共静态布尔运算符==(MyClass第一,MyClass第二)
HashSet
仅检查具有相同hashcode的项是否相等。您需要超越
GetHashCode
方法,并以一种方式实现它,使相等的对象返回相同的hashcode。@Knoop Ahhh得到了它。我认为它使用了Equals方法。我覆盖了Equals和GetHashCode。关于FirstOrDefault的等式比较,我的问题是什么?你也可以直接重载你感兴趣的操作符<代码>公共静态布尔运算符==(MyClass第一,MyClass第二)。