如何做foreach查询同时检查null case?

时间:2013-11-04 18:41:09

标签: c# foreach

好的,这就是我现在正在做的事情,但我想知道有没有更好的方法呢?

            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

3 个答案:

答案 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>)
{
}