почему Enumerable.Except возвращает элементы DISTINCT?

Потратив больше часа на отладку ошибки в нашем коде, которая в итоге оказалась чем-то вроде метода Enumerable.Except , о котором мы не знали:

var ilist = new[] { 1, 1, 1, 1 };
var ilist2 = Enumerable.Empty();
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

вы получаете пустой массив, потому что каждый элемент в первом массиве «появляется» во втором и, следовательно, должен быть удален.

Но почему мы получаем только отдельные экземпляры всех других элементов, которых нет во втором массиве? Каково объяснение такого поведения?

10
задан theburningmonk 20 December 2010 в 18:00
поделиться