【问题标题】:LINQ: Sequence contains no elements errorLINQ:序列不包含元素错误
【发布时间】:2013-08-08 00:18:27
【问题描述】:

我正在尝试解决使用 LINQ 的错误。 我正在使用 LINQ 提取 XML 节点值。我面临的问题是,当 XML 中不存在该节点时,我收到 Sequence contains no elements 错误。 我尝试使用 DefaultIfEmpty、Singleordefault 和 Firstordefault。 但随后它会引发空指针异常。我想我不是正确的方法。 如何使用其中之一来解决问题?

这是我正在使用的 LINQ 代码。

var costnode6 = doc.Root.Descendants(ns + "SERVICEUPGRADES").Single(c => (string)c.Element(ns + "DELIVERYTIME") == "before 3:30 PM").Element(ns + "TOTAL_COST");
        var cost6 = (decimal)costnode6;

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    如果没有结果,OrDefault 方法将返回类型的默认值,在您的情况下为null。这意味着当您在该呼叫之后执行.Element(ns + "TOTAL_COST") 时,如果使用Single,您将收到Sequence contains no elements 错误,如果使用SingleOrDefault,您将收到Null Reference Exception

    你应该做的是拉出调用并检查结果是否为空:

    var deliveryTime = doc.Root.Descendants(ns + "SERVICEUPGRADES")
        .SingleOrDefault(c => (string)c.Element(ns + "DELIVERYTIME") == "before 3:30 PM");
    if(deliveryTime != null)
    {     
        var costnode6 = deliveryTime.Element(ns + "TOTAL_COST");
        var cost6 = (decimal)costnode6;   
    }
    

    【讨论】:

      【解决方案2】:

      使用SingleOrDefault,但在尝试使用costnode6之前有一个保护子句,如下所示:

      var costnode6 = doc.Root.Descendants(ns + "SERVICEUPGRADES").SingleOrDefault(c => (string)c.Element(ns + "DELIVERYTIME") == "before 3:30 PM").Element(ns + "TOTAL_COST");
      
      if(costnode6 != null)
      {
          var cost6 = (decimal)costnode6;
      }
      

      这将保护您的 LINQ 查询不被炸毁,因为如果没有找到一个结果,OrDefault 将使查询结果为nullif 条件将保护您免于尝试使用 null 对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多