好的,这就是我现在正在做的事情,但我想知道有没有更好的方法呢?
if (vrChildNode.SelectNodes("//href") != null)
foreach (var vrNodes in vrChildNode.SelectNodes("//href"))
{
}
如你所见,我实际上是在查询2次。首先是空检查,第二个是foreach。
如果我按照下面的方式执行,如果没有节点
,则会抛出错误 foreach (var vrNodes in vrChildNode.SelectNodes("//href"))
{
}
感谢您的回答
c#.net 4.5
答案 0 :(得分:8)
您可以创建一个扩展方法来进行检查并确保结果为非null:
public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> source)
{
return source ?? Enumerable.Empty<T>();
}
然后你可以写:
foreach (var vrNodes in vrChildNode.SelectNodes("//href").EmptyIfNull())
{
}
答案 1 :(得分:3)
最好也是最清楚的方法是将其存储在变量中:
var nodes = vrChildNodes.SelectNodes("//href");
if (nodes != null)
foreach (var vrNodes in nodes)
{
}
一种不那么干净且不太明显的方式,但只有一个衬垫:
foreach (var vrNodes in vrChildNodes.SelectNodes("//href") ?? Enumerable.Empty<nodeType>)
{
}
我真的建议你先做第一件事。每个人都会看到你的意思。使用第二种方法,您首先必须首先考虑并考虑目的是什么(我认为SelectNodes 可以返回null已经是可怕的结果,但我知道这不在您手中)。< / p>
如果您愿意,还可以创建一个扩展方法来为您进行检查:
public static IEnumerable<nodeType> SelectNodesSafe(this typeOfvrChildNodes t, string selector)
{
var res = t.SelectNodes(selector);
if (res == null)
return Enumerable.Empty<nodeType>();
else // Redundant else
return res;
}
答案 2 :(得分:1)
foreach (var vrNodes in vrChildNode.SelectNodes("//href") ?? Enumerable.Empty<type>)
{
}