2015-11-25 2 views
-1

Постулаты:Linq странное поведение

(definitions != null && definitions.Where(key => key.asset_id != null && 
              key.asset_id == item).FirstOrDefault() != null 

Броски:

коллекция была изменена операция перечисления не может выполнить

Как это исправить?

if (definitions != null 
    && definitions 
     .Where(key => key.asset_id != null && key.asset_id == item) 
     .FirstOrDefault() != null) 
{ 
    CurrentDuration = definitions 
         .Where(key => key.asset_id != null && key.asset_id == item) 
         .FirstOrDefault().duration; 
} 
+2

бежишь это внутри любого цикла? – Sajeetharan

+0

Эта часть внутри функции DrawBox(), и эта функция находится внутри foreach.Yes. – A191919

+1

Опубликовать эту часть тоже – Sajeetharan

ответ

3

Проблема в том, что где-то в вашем коде изменяется коллекция definitions. В основном это из-за модификации коллекции в другом потоке, но у нее могут быть и другие причины. Вы должны узнать фрагмент кода, который модифицирует коллекцию в другом месте. Вы можете защитить переменную definitions, используя lock, где бы вы ни использовали definitions.

if (definitions != null) 
{ 
    lock (definiitons) 
    { 
     var definition = definitions.FirstOrDefault(key => key.asset_id != null && key.asset_id == item); 
     if (definition != null) 
      CurrentDuration = definition.duration; 
    } 
} 

и поставить замок везде вы изменяете definitions или ссылки на него, например:

lock (definitions) 
{ 
    definitions.Add(x); 
} 

или

lock (definitions) 
{ 
    definitions.Remove(x); 
} 

или даже

var otherRef = definitions 
lock (otherRef) 
{ 
    otherRef .Add(x); 
} 
0

Я предполагаю, что «CurrentDuration» является счетчиком переменных цикла foreach.

Оператор foreach используется для перебора коллекции, чтобы получить необходимую информацию, но не может использоваться для добавления, удаления или изменения элементов из исходной коллекции, чтобы избежать непредсказуемых побочных эффектов. Если вам нужно добавить, удалить или изменить элементы из исходной коллекции, используйте цикл for.

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