【问题标题】:Linq expression throws an ArgumentNullExceptionLinq 表达式引发 ArgumentNullException
【发布时间】:2012-01-02 08:25:59
【问题描述】:

GetSpecialNodes 有时会返回 null。当它发生时,我会抛出一个 ArgumentNullException。除了在运行 Linq 表达式并进行空值检查之前调用 GetSpecialNodes 之外,是否有一种优雅的方式来处理(更改 linq 表达式)?

var nodes = (from HtmlNode node in document.GetSpecialNodes() select node);

【问题讨论】:

  • document 值还是为空?

标签: c# linq


【解决方案1】:

可能

var nodes = (document.GetSpecialNodes() ?? new List<HtmlNode>()).ToList<HtmlNode>()

【讨论】:

    【解决方案2】:

    我猜你所做的不仅仅是选择来自GetSpecialNodes() 的节点。因此,您可能希望避免在GetSpecialNodes() 上调用ToList() 以从延迟执行中获利。您可以使用Enumerable.Empty&lt;HtmlNode&gt;() 创建一个空集:

    var nodes = document.GetSpecialNodes() ?? Enumerable.Empty<HtmlNode>();
    

    我认为在定义查询之前执行此操作时,您的代码将更具可读性:

    var nodes = document.GetSpecialNodes() ?? Enumerable.Empty<HtmlNode>();
    var result = from HtmlNode node in nodes where /* some predicate */
    

    对比

    var nodes = (from HtmlNode node in (document.GetSpecialNodes() ?? Enumerable.Empty<HtmlNode>()) where /* some predicate */)
    

    【讨论】:

      【解决方案3】:

      如果您可以选择,请更改 GetSpecialNodes(),使其返回 Enumerable.Empty&lt;HtmlNode&gt;() 而不是 null。返回一个空集合而不是 null 总是更好,然后您可以使用 .Any() 扩展方法检查集合中的项目。

      或者按照 Stefan 的建议:

      var nodes = 
        from HtmlNode node in (document.GetSpecialNodes() ?? Enumerable.Empty<HtmlNode>())
        select node;
      

      【讨论】:

        猜你喜欢
        • 2019-11-07
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多