C#Tuple Equality vs包含在列表中

时间:2016-10-04 10:35:04

标签: c# tuples

我最近遇到了一个列表中元组的惊人行为。似乎列表中的包含与我期望的不同。请有人解释一下这个区别吗?

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

编辑1:解决重复标记。我知道==和.Equals是不同的函数,这里令人惊讶的是List.Contains函数中的特定实现。

4 个答案:

答案 0 :(得分:2)

元组是作为参考类型实现的,更多信息请read here

基线是参考类型==执行身份比较,因此只有当两个引用都指向同一个对象时,结果才为真。

Equals方法执行值比较,如果引用指向等效的对象,它将返回true。

答案 1 :(得分:2)

A == B比较引用,因为它们指向两个不同的对象,结果为false。我认为这对你来说已经很熟悉了。

bool C = AList.Contains(B);将调用.Equal来检查相等性,从而返回true。

差异与A == B vs A.Equals(B)

相同

答案 2 :(得分:1)

Contains使用从Equals

继承的object方法

==测试实例的相等性(即它们是否引用了相同的实例)。

因此,我们可以总结Tuple必须覆盖Equals并在每个元素匹配时返回true,而==必须检查左侧和右侧的实例是否为同样的。

答案 3 :(得分:1)

这很奇怪所以我也看了一眼。当你尝试

bool D = A.Equals(B);

它会返回true,这使我看到C# difference between == and Equals()

希望这有帮助