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

Просто потратив более часа на отладку ошибки в нашем коде, которая в итоге оказалась чем-то вроде 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

Я, конечно, не могу точно сказать, почему они решили это сделать. Однако я сделаю это.

MSDN описывает кроме этого:

Производит разницу set двух последовательностей, используя значение по умолчанию сравните значения.

A Set описывается следующим образом:

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