重写C#equals运算符是否也适用于测试列表相等性?
我有一个像这样重写C#s==运算符的类重写C#equals运算符是否也适用于测试列表相等性?,c#,equality,C#,Equality,我有一个像这样重写C#s==运算符的类 public class Foo { /*Variables and Constructors*/ public static bool operator ==(Foo a, Foo b) { /*Check values for equality*/ } } 这是否意味着如果我运行这个表达式 List<Foo> listA == List<Foo> listB List l
public class Foo
{
/*Variables and Constructors*/
public static bool operator ==(Foo a, Foo b)
{
/*Check values for equality*/
}
}
这是否意味着如果我运行这个表达式
List<Foo> listA == List<Foo> listB
List listA==List listB
它会变成真的吗?如果不是,我应该如何测试这些列表的相等性?否-列表
不会覆盖相等性
,因此默认情况下它使用引用相等性
一个可能的原因是对集合有不同的“相等”定义。秩序重要吗?复制品呢
Linq提供了一种易于使用的方法,文档提供了它使用的标准:
[返回]true
如果两个源序列长度相等,并且根据其类型的默认相等比较器,它们对应的元素相等;否则,false
使用
listA.SequenceEqual(listB);
它将调用该类型的默认相等比较器。我很确定这意味着你必须为你的类提供一个equals()方法实现(而不是重载==操作符)。你考虑过试试吗?@JoshLeBlanc为什么要在谷歌上试试你能做的?谷歌搜索了这个问题,但找不到一个好的简洁的答案,所以现在将有oneNote,你不能覆盖操作符-你只能重载它们。至于“如果我运行这个表达式”-这是一个无效的表达式开始,所以你只会得到一个编译时错误…明白了,那么测试列表是否相等的最佳方法是什么?所以SequenceEqual将为列表中的每个项调用重载==运算符?@NickG这取决于我提到的条件-顺序重要吗?复制品呢?管柱套管?没有一种方法在所有情况下都有效。@不,如果实现该接口,它将使用
IEquatable.Equals
,否则它将使用Object.Equals
的重写。在任何一种情况下,它都将首先使用GetHashCode
来查看这两个对象是否相等。@NickG仅供参考,建议您不要在可变类型中重载==
。您应该只覆盖Equals
(并且可以选择实现IEquatable
,以进行类型安全的相等性检查)