Linq 奇怪的行为

A19*_*919 0 c# linq

声明:

(definitions != null && definitions.Where(key => key.asset_id != null &&
                                          key.asset_id == item).FirstOrDefault() != null
Run Code Online (Sandbox Code Playgroud)

投掷:

集合被修改,枚举操作可能无法执行

如何解决这个问题?

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;
}
Run Code Online (Sandbox Code Playgroud)

meh*_*dvd 5

问题是代码中的某个地方definitions集合被修改了。主要是因为另一个线程中的集合修改,但也可能有其他一些原因。您应该在其他地方找出正在修改集合的代码段。无论您在何处使用,都可以使用 来保护definitions变量。lockdefinitions

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

并在修改definitions或其引用的任何地方放置锁定,例如:

lock (definitions)
{
    definitions.Add(x);
}
Run Code Online (Sandbox Code Playgroud)

或者

lock (definitions)
{
    definitions.Remove(x);
}
Run Code Online (Sandbox Code Playgroud)

甚至

var otherRef = definitions
lock (otherRef )
{
    otherRef .Add(x);
}
Run Code Online (Sandbox Code Playgroud)