2015-11-25 68 views
-1

Statment: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集合已被修改。主要是因为在另一个线程中收集修改,但它可能有其他一些原因。你应该找出正在修改集合的代码段。无论您使用何种方式,您都可以使用lock来保护definitions变量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循环。