0

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

            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

4

3 回答 3

8

您可以创建一个扩展方法来进行检查并确保结果为非空:

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> source)
{
    return source ?? Enumerable.Empty<T>();
}

然后你可以写:

foreach (var vrNodes in vrChildNode.SelectNodes("//href").EmptyIfNull())
{

}
于 2013-11-04T18:44:17.817 回答
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 已经是可怕的结果,但我知道这不在您的手中)。

如果您愿意,您还可以创建一个扩展方法来为您进行检查:

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;
}
于 2013-11-04T18:43:04.043 回答
1
foreach (var vrNodes in vrChildNode.SelectNodes("//href") ?? Enumerable.Empty<type>)
{
}
于 2013-11-04T18:45:18.520 回答