Эти два понятия не полностью разделены. Where
не создает отдельную копию коллекции. Она внутренне хранит ссылку на исходную коллекцию и извлекает из нее элементы по вашему запросу.
Вы можете решить свою проблему, добавив ToList()
, чтобы заставить Where
выполнять итерации по коллекции немедленно.
var strDifferences = CollectionA
.Where(foo => !CollectionB.Contains(foo))
.ToList();
Попробуйте немного изменить первую строку:
var strDifferences =
CollectionA.Where(foo => !CollectionB.Contains(foo)).ToList();
Я думаю, что LINQ использует отложенное выполнение вашего запроса. Вызов ToList
принудительно выполнит запрос перед перечислением.
Где
возвращает IEnumerable
, а затем вы используете это в своем foreach (var strVar in strDifferences)
Затем вы пытаетесь удалить его из коллекции, создавшей IEnumerable
. Вы не создали новый список, он ссылается на CollectionA
для извлечения следующего элемента, поэтому вы не можете редактировать CollectionA
.
Вы также можете сделать это:
var strDifferences = CollectionA.Where
(foo => CollectionB.Contains(foo)).ToList();
CollectionA = strDifferences;
//or instead of reassigning CollectionA
CollectionA.Clear();
CollectionA.AddRange(strDifferences);
Поскольку вы удаляете те, которых нет в CollectionB. Просто найдите те, которые есть, создайте список и назначьте этот список переменной CollectionA.