Просто потратив более часа на отладку ошибки в нашем коде, которая в итоге оказалась чем-то вроде 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
вы получаете пустой массив, потому что каждый элемент в первом массиве "появляется" во втором и поэтому должен быть удален.
Но почему мы получаем только отдельные экземпляры всех других элементов, которые не отображаются во втором массиве? Какое обоснование этого поведения?