C# LINQ to Objects表达式的输入参数如何为null
我有一个我正试图用LINQ查询的对象集合。令人费解的是,当查询特定值时,代码正在崩溃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值与失败
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在集合中插入了空值。