如何在 .net 中检查 lambda 表达式中的空引用

How to check null reference in lambda expression in .net

我正在使用以下代码处理 xml 文件,但是如何检查我曾经得到的空引用异常

var main = System.Xml.Linq.XDocument.Load("1.xml");

string localcellid = main.Descendants()
    .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "eNodeBCell_eNodeB"))
    .Descendants("parameter")
    .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "LocalCellId"))
    .Attribute("value").Value;

string eNodeBId = main.Descendants()
    .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "eNodeB_eNodeB"))
    .Descendants("parameter")
    .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "eNodeBId"))
    .Attribute("value").Value;

正如 Nikosi 所说,每个 FirstOrDefault 都有可能 return null,你需要考虑到这一点。

你可以提前检查(我只添加了1个检查作为示例):

var eNodeBCell_eNodeB = main.Descendants()
    .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "eNodeBCell_eNodeB"));

if (eNodeBCell_eNodeB != null)
{
    string localcellid = eNodeBCell_eNodeB
        .Descendants("parameter")
        .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "LocalCellId"))
        .Attribute("value").Value;
}

或者您可以使用空条件运算符 (?.):

string eNodeBId = main.Descendants()
    .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "eNodeB_eNodeB"))
    ?.Descendants("parameter")
    .FirstOrDefault(x => x.Attributes().Any(a => a.Value == "eNodeBId"))
    ?.Attribute("value").Value;

无论如何,您稍后需要检查这些值的空值。