为什么Enumerable.Except返回DISTINCT项?

时间:2010-12-20 18:00:49

标签: c# .net linq

我们花了一个多小时调试代码中的错误,最后发现这是我们不知道的Enumerable.Except方法:

var ilist = new[] { 1, 1, 1, 1 };
var ilist2 = Enumerable.Empty<int>();
ilist.Except(ilist2); // returns { 1 } as opposed to { 1, 1, 1, 1 }

或更一般地说:

var ilist3 = new[] { 1 };
var ilist4 = new[] { 1, 1, 2, 2, 3 };
ilist4.Except(ilist3); // returns { 2, 3 } as opposed to { 2, 2, 3 }

查看MSDN页面:

  

此方法返回这些元素   首先,不出现在第二。它   也没有返回那些元素   第二个没有出现在第一个。

在这样的情况下我明白了:

var ilist = new[] { 1, 1, 1, 1 };
var ilist2 = new[] { 1 };
ilist.Except(ilist2); // returns an empty array

你得到空数组,因为第一个数组中的每个元素'都出现'在第二个数组中,因此应该被删除。

但为什么我们只得到第二个数组中没有出现的所有其他项目的不同实例?这种行为背后的理由是什么?

1 个答案:

答案 0 :(得分:16)

我当然不能肯定地说他们为什么决定这样做。但是,我会试一试。

MSDN描述除此之外:

  

产生设置两者的差异   序列使用默认值   等于比较来比较值。

Set被描述为:

  

集合是不同的集合   对象,被视为对象   它自己的权利