IEnumerable уменьшает при изменении его содержимого? - PullRequest
2 голосов
/ 07 июля 2011

Я обнаружил странное поведение IEnumerable. Когда я создаю коллекцию с использованием Linq to XML, а затем зацикливаю коллекцию и изменяю ее элементы, размер коллекции уменьшается на 1 при каждом прохождении цикла. Вот о чем я говорю:

    var nodesToChange =  from A in root.Descendants()
                         where A.Name.LocalName == "Compile"
                         && A.Attribute("Include").Value.ToLower().Contains(".designer.cs")
                         && A.HasElements && A.Elements().Count() == 1
                         select A;
    foreach (var node in nodesToChange) {
          //after this line the collection is reduced
          node.Attribute("Include").Value = node.Attribute("Include").Value.Replace(".Designer.cs", ".xaml");
    }

Но если я добавлю только ToArray<XElement>() в конец выражения linq, проблема будет решена.

Может кто-нибудь объяснить мне, почему это происходит? Спасибо.

1 Ответ

5 голосов
/ 07 июля 2011

Запрос оценивается в каждом цикле цикла.

Вы изменяете значение Include, чтобы элемент больше не возвращался из вашего запроса, так как он не соответствует

A.Attribute("Include").Value.ToLower().Contains(".designer.cs")

При вызове ToArray или ToList в вашем запросе цикл перечисляет фиксированную коллекцию, поэтому ваши манипуляции не влияют.

...