如何摆脱LinQ Query中的nullReferenceException?

时间:2013-10-30 09:59:01

标签: linq

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;
    }

即使在tab-index 5处有一个控件,Get Control也会获得一个空值。

1 个答案:

答案 0 :(得分:2)

首先,...OrDefault返回给定类型的默认值,如果是引用类型(如Control),则会得到null。那么你可以简单地检查:

if(getCntrl != null)
{
    // safe....
}

如果您希望控件的文字和""默认为Where找不到匹配的控件,请使用Select + DefaultIfEmpty

string getCntrlText = IterateThroughCntrls.Controls.Cast<Control>()
    .Where(x => x.TabIndex ==  i)
    .Select(ctrl => ctrl.Text)
    .DefaultIfEmpty("")
    .Single();

请注意,由于我提供了默认值,因此我使用了Single

请注意,如果多个项与谓词匹配,Single...会抛出异常(而不是First...)。通常它与关键属性一起使用,在这些属性中不可能找到多个元素。因此,First(或FirstOrDefault)似乎更合适。