GetSpecialNodes有時會返回null。當它發生時,我得到拋出的ArgumentNullException。除了在運行Linq表達式和執行空檢查之前調用GetSpecialNodes之外,是否還有一種優雅的處理方式(對linq表達式的更改)?Linq表達式拋出ArgumentNullException
var nodes = (from HtmlNode node in document.GetSpecialNodes() select node);
GetSpecialNodes有時會返回null。當它發生時,我得到拋出的ArgumentNullException。除了在運行Linq表達式和執行空檢查之前調用GetSpecialNodes之外,是否還有一種優雅的處理方式(對linq表達式的更改)?Linq表達式拋出ArgumentNullException
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()
擴展方法檢查集合中的項目。
或者像斯特凡建議:
var nodes =
from HtmlNode node in (document.GetSpecialNodes() ?? Enumerable.Empty<HtmlNode>())
select node;
已'document'值還是空? – Fischermaen 2012-01-02 08:28:25