2014-11-10 2 views
-2

У меня этот код:Почему он не перебирает все элементы IEnumerable?

public static void myMethodMytype paramObject, IEnumerable<MyType> paramObjects) 
{ 

    IEnumerable<Mytype> ieFilteredObjects = paramObjects.Where(x=>x.IDType == paramObject.IDType); 

    if (ieFilteredObjects.Count() == 2) 
    { 
     foreach (MyType iterator in ieFilteredObjects) 
     { 
      iterator.MyProperty = null; 
     } 
    } 
} 

В этом случае ieFilteredObjects имеет 2 элемента, но в Еогеаспе, обновлять только первый элемент, а выход из Еогеаспа.

Если в Еогеасп я использую это:

foreach (MyType iterator in ieFilteredObjects.ToList()) 

затем он работает, как ожидалось.

Почему мне нужно преобразовать IEnumerable в список?

Спасибо.

+3

Ваш явно неправильный код и правильный код должны функционировать одинаково (разрешить повторение перечисления). Причина отказа, на мой взгляд, не показана в коде, который вы представили. –

+1

Счет вашего запроса может изменяться между вашим методом 'Count()' и 'GetEnumerator' внутри foreach, поскольку он выполняет предложение' Where' каждый раз, когда вы повторяете. «paramObjects» мутируется вне метода? –

ответ

0

IEnumerable может повторяться только один раз. Вы не можете дважды повторять итерацию на IEnumerable и ожидать получить те же значения.

Например, IEnumerable может исходить из функции yield return, каждый раз, когда вы вызываете GetEnumerator() на IEnumerable, вы начинаете новый вызов этой функции, который может создавать новые значения.

Это не обычный прецедент, но он существует. У меня уже была такая ошибка в производстве.

Решение для кэш результат первой итерации. Общий метод заключается в использовании LINQ: .ToList() создать IList, что вы можете перебирать до бесконечности

В своем коде вы итерацию по крайней мере дважды:

  • ieFilteredObjects.Count()
  • Еогеасп (Итератор MyType в ieFilteredObjects)
+4

Что это значит, что он может быть повторен только один раз? Я успешно повторяю перечисления много раз все время. –

+0

'IEnumerable может повторяться только один раз. Я так не думаю. Где ты нашел это? – PoweredByOrange

+0

Вы перебираете 'IEnumerable', каждый раз получая новый' IEnumerator'. Ваш ответ неверен. –

Смежные вопросы