如何消除LinQ查询中的nullReference异常?
gridview_new是一个表单类如何消除LinQ查询中的nullReference异常?,linq,Linq,gridview_new是一个表单类 private checkNulls[] CheckNulls() { checkNulls Cntrl; checkNulls[] cntrlsToupdate = new checkNulls[15]; using (gridview_new IterateThroughCntrls = new gridview_new()) {
private checkNulls[] CheckNulls()
{
checkNulls Cntrl;
checkNulls[] cntrlsToupdate = new checkNulls[15];
using (gridview_new IterateThroughCntrls = new gridview_new())
{
for (int i = 5; i < 18; i++)
{
var getCntrl =
IterateThroughCntrls.Controls.Cast<Control>().Where(x => x.TabIndex == i).SingleOrDefault();
if (!(getCntrl.Text == ""))
{
Cntrl = (checkNulls)(i);
cntrlsToupdate[i - 5] = Cntrl;
}
}
}
return cntrlsToupdate;
}
private checkNulls[]checkNulls()
{
checkNulls Cntrl;
checkNulls[]cntrlsToupdate=新的checkNulls[15];
使用(gridview\u new IterateThrowCntrls=new gridview\u new())
{
对于(int i=5;i<18;i++)
{
变量getCntrl=
IterateThrowCntrls.Controls.Cast()。其中(x=>x.TabIndex==i)。SingleOrDefault();
如果(!(getCntrl.Text==“”)
{
Cntrl=(检查空)(i);
cntrlsToupdate[i-5]=Cntrl;
}
}
}
返回cntrlsToupdate;
}
Get Control即使在选项卡索引5处有一个控件,也会得到一个null值。首先,
…OrDefault
返回给定类型的默认值,如果是引用类型(如Control
),则会得到null
。因此,您可以简单地检查:
if(getCntrl != null)
{
// safe....
}
如果要将控件的文本和“
作为默认值,如果中的未找到匹配控件,请使用选择+默认值ifempty
:
string getCntrlText = IterateThroughCntrls.Controls.Cast<Control>()
.Where(x => x.TabIndex == i)
.Select(ctrl => ctrl.Text)
.DefaultIfEmpty("")
.Single();
string getcntrtext=iteratethrowcntrls.Controls.Cast()
.其中(x=>x.TabIndex==i)
.Select(ctrl=>ctrl.Text)
.DefaultIfEmpty(“”)
.Single();
请注意,我使用了Single
,因为我提供了一个默认值
请注意,如果多个项与谓词匹配,Single…
将引发异常(与First…
相反)。通常,它与键属性一起使用,在这些属性中不可能找到多个元素。因此,First
(或First或default
)在这里似乎更合适。首先要解决的是您的命名问题-您的类型和变量名使此代码目前很难阅读。您还需要告诉我们int
和checkNulls
之间的转换是什么-可能这是一个自定义转换,但您没有告诉我们任何有关它的信息。是否也有TabIndex==6、7、…、17的控件?