Почему, я получающий “Набор был изменен; операция перечисления не может выполнить” если не изменение перечислимого набора? [дубликат]

19
задан Grace Note 7 May 2010 в 20:31
поделиться

3 ответа

Эти два понятия не полностью разделены. Where не создает отдельную копию коллекции. Она внутренне хранит ссылку на исходную коллекцию и извлекает из нее элементы по вашему запросу.

Вы можете решить свою проблему, добавив ToList(), чтобы заставить Where выполнять итерации по коллекции немедленно.

var strDifferences = CollectionA
    .Where(foo => !CollectionB.Contains(foo))
    .ToList();
27
ответ дан 30 November 2019 в 03:48
поделиться

Попробуйте немного изменить первую строку:

var strDifferences =
    CollectionA.Where(foo => !CollectionB.Contains(foo)).ToList();

Я думаю, что LINQ использует отложенное выполнение вашего запроса. Вызов ToList принудительно выполнит запрос перед перечислением.

3
ответ дан 30 November 2019 в 03:48
поделиться

Где возвращает 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.

4
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: