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);
可能
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;