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