Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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#元组等式与列表中的包含_C#_Tuples - Fatal编程技术网

C#元组等式与列表中的包含

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>

我最近遇到了列表中元组的一些令人惊讶的行为。似乎列表中的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>>() {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()
作为比较,而不是
=
谢谢,这非常有用:)