C#元组等式与列表中的包含
我最近遇到了列表中元组的一些令人惊讶的行为。似乎列表中的Contains所做的比较与我所期望的不同。有人能解释一下区别吗C#元组等式与列表中的包含,c#,tuples,C#,Tuples,我最近遇到了列表中元组的一些令人惊讶的行为。似乎列表中的Contains所做的比较与我所期望的不同。有人能解释一下区别吗 Tuple<int,int> A = new Tuple<int, int>(5,5); Tuple<int, int> B = new Tuple<int, int>(5, 5); List<Tuple<int,int>> AList = new List<Tuple<int, int>
Tuple<int,int> A = new Tuple<int, int>(5,5);
Tuple<int, int> B = new Tuple<int, int>(5, 5);
List<Tuple<int,int>> AList = new List<Tuple<int, int>>() {A};
bool C = AList.Contains(B); // returns true
bool D = A == B; // returns false
Tuple A=新的Tuple(5,5);
元组B=新元组(5,5);
列表列表=新列表(){A};
bool C=AList.Contains(B);//返回true
bool D=A==B;//返回false
编辑1:处理重复标志。我知道==和.Equals是不同的函数,这里令人惊讶的是List.Contains函数中的特定实现
Contains
使用从对象继承的Equals
方法
=
测试实例的相等性(即,它们是否引用相同的确切实例)
因此,我们可以总结出,Tuple
必须覆盖Equals
,如果每个元素匹配,则返回true,而=
必须检查左侧和右侧的实例是否相同。这很奇怪,所以我也看了一下。当你尝试
bool D = A.Equals(B);
它返回true
,这让我看了一下
希望这有帮助元组被实现为引用类型,有关更多信息,请参阅
基线是,对于引用类型==
,执行标识比较,因此,只有当两个引用都指向同一对象时,结果才会为真
Equals
方法执行值比较,如果引用指向等效的对象,它将返回true。a==B比较引用,因为它们指向两个不同的对象,所以结果为false。我想这对你来说已经很熟悉了
bool C=列表包含(B);将调用.Equal,它检查是否相等,从而返回true
这个区别与A==B与A.Equals(B)的区别相同。列表将调用.Equals()
作为比较,而不是=
谢谢,这非常有用:)