Linq表达式抛出一个ArgumentNullException

本文关键字:一个 ArgumentNullException 表达式 Linq | 更新日期: 2023-09-27 18:19:09

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

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

Linq表达式抛出一个ArgumentNullException

可能

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

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

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 */)

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

或者像Stefan建议的那样:

var nodes = 
  from HtmlNode node in (document.GetSpecialNodes() ?? Enumerable.Empty<HtmlNode>())
  select node;
相关文章: