C# LINQ to Objects表达式的输入参数如何为null

C# LINQ to Objects表达式的输入参数如何为null,c#,linq-to-objects,C#,Linq To Objects,我有一个我正试图用LINQ查询的对象集合。令人费解的是,当查询特定值时,代码正在崩溃 SomeObject[] myObjects = { ... }; foreach (int id in someIDs) { SomeObject singleObject = myObjects.FirstOrDefault(x => x.ID = id); } 当id的值为特定值时,此代码失败。我得到的错误是x为空。myObjects数组不为空,并且确实包含一个对象,该对象的ID值与失败

我有一个我正试图用LINQ查询的对象集合。令人费解的是,当查询特定值时,代码正在崩溃

SomeObject[] myObjects = { ... };

foreach (int id in someIDs)
{
    SomeObject singleObject = myObjects.FirstOrDefault(x => x.ID = id);
}
id
的值为特定值时,此代码失败。我得到的错误是
x
为空。
myObjects
数组不为空,并且确实包含一个对象,该对象的
ID
值与失败的
ID
值匹配。
id
的其他值不会导致错误。当
id
是失败的值时,我可以在LINQ表达式遍历数组中的项时逐步遍历它。参数
x
对集合中的每个项目都有一个值,直到它到达与
id
的问题值匹配的项目之前的项目为止;此时,
x
突然变为NULL,并引发异常

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

修复空值并大幅提高运行时性能,如下所示:

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
    }
}
SomeObject[]myObjects=new[]{…};
字典dict=myObjects
.其中(mo=>mo!=null)
.ToDictionary(mo=>mo.id);
foreach(someid中的Int32 id)
{
if(dict.TryGetValue(id,out SomeObject singleObject))
{
//在这里做事
}
其他的
{
//不要在这里做事
}
}

并不是说
myObjects
null
,而是说
myObjects
的元素成员是
null
。例如,
SomeObject[]myObjects=new[]{foo,bar,null,baz}
x=>x!=null&&x.ID=ID
此外,您发布的代码运行时复杂度很低(
O(n*m)
)。您应该首先将
myObjects
转换为字典(在循环之外),以便在循环内部获得
O(1)
查找和
O(n)
总体性能。
myObjects.FirstOrDefault(x=>x?.ID==ID)@Dai,谢谢。我感到困惑,因为集合不应该包含任何空值。事实证明,这一行的另一个bug在集合中插入了空值。