刚花了一个多小时调试我们代码中的错误,最后结果证明是我们不知道的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 }
Run Code Online (Sandbox Code Playgroud)
或更一般地说:
var ilist3 = new[] { 1 };
var ilist4 = new[] { 1, 1, 2, 2, 3 };
ilist4.Except(ilist3); // returns { 2, 3 } as opposed to { 2, 2, 3 }
Run Code Online (Sandbox Code Playgroud)
查看MSDN页面:
此方法首先返回那些未出现在第二个元素中的元素.它也不会返回第二个中没有出现的元素.
在以下情况下我得到它:
var ilist = new[] { 1, 1, 1, 1 };
var ilist2 = new[] { 1 };
ilist.Except(ilist2); // returns an empty array
Run Code Online (Sandbox Code Playgroud)
你得到空数组,因为第一个数组中的每个元素'都出现'在第二个数组中,因此应该被删除.
但是为什么我们只得到第二个数组中没有出现的所有其他项的不同实例?这种行为背后的理由是什么?