LINQ to Objects 表达式的输入参数如何为空

How can the input parameter of a LINQ to Objects expression be null

我有一组对象正在尝试使用 LINQ 查询。莫名其妙,代码在查询特定值时崩溃。

SomeObject[] myObjects = { ... };

foreach (int id in someIDs)
{
    SomeObject singleObject = myObjects.FirstOrDefault(x => x.ID = id);
}

id 的值为特定值时,此代码失败。我得到的错误是 x 为 NULL。 myObjects 数组不是 NULL,并且确实包含一个对象,该对象的 ID 值与失败的 id 的值相匹配。 id 的其他值不会导致错误。当 id 是失败的值时,我可以逐步执行 LINQ 表达式,因为它循环访问数组中的项目。参数 x 对集合中的每个项目都有一个值,直到它到达与问题值 id 匹配的项目之前的项目;在那一点 x 突然变成 NULL 并抛出异常。

非 NULL 集合上的 LINQ 表达式的输入参数怎么会是 NULL?即使集合不包含 ID 匹配 id 的项目,它也应该只是 return 我的对象类型的默认值,不会因 NULL 错误而崩溃。

修复空值 显着提高运行时性能,如下所示:

SomeObject[] myObjects = new[] { ... };

Dictionary<Int32,SomeObject> dict = myObjects
    .Where( mo => mo != null )
    .ToDictionary( mo => mo.id );

foreach( Int32 id in someIds )
{
    if( dict.TryGetValue( id, out SomeObject singleObject ) )
    {
        // do stuff here
    }
    else
    {
        // don't do stuff here
    }
}