Почему 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 описывается следующим образом:
Набор представляет собой набор различныхобъектов, рассматриваемых как объект в его собственное право