Объясните, пожалуйста, как это работает?
foreach (var productModel in productModels)
{
foreach (var barCode in productModel.BarCodes)
{
if (uniqueBarCodes.Contains(barCode))
{
productModel.BarCodes = productModel.BarCodes.Where(b => b != barCode).ToArray();
}
}
}
Почему изменяя productModel, меняется и изначальная коллекция?
Будет или не будет изменяться объект в коллекции productModels зависит от того, каким типом является ее элемент: ссылочным или значимым, если первым, то в переменную productModel попадает только ссылка на элемент, в коллекции также хранится только ссылка (это, по сути, указатель на область памяти, где хранится сам объект), естественно, что в этом случае Вы просто меняете объект, находящийся по ссылке. Если же тип значимый, то в productModel попадет копия объекта, тогда элемент коллекции productModels изменяться не будет. Изучите систему типов .NET, тогда таких вопросов у Вас не будет.
Про типы можно почитать здесь: https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/types/
Про ссылочные типы: https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/reference-types
Также, есть две неплохих статьи на Хабре: https://habrahabr.ru/sandbox/68552/ https://habrahabr.ru/post/113586/
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости