0

これは私が今していることですが、それを行うためのより良いアプローチがあるのだろうか?

            if (vrChildNode.SelectNodes("//href") != null)
                foreach (var vrNodes in vrChildNode.SelectNodes("//href"))
                {

                }

ご覧のとおり、実際には2回クエリを実行しています。1 つ目は null チェック、2 つ目は foreach です。

以下の方法を実行すると、ノードがない場合にエラーがスローされます

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

                }

回答ありがとうございます

c#.net 4.5

4

3 に答える 3

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())
{

}
于 2013-11-04T18:44:17.817 に答える
3

最良かつ最も明確な方法は、変数に格納することです。

var nodes = vrChildNodes.SelectNodes("//href");
if (nodes != null)
    foreach (var vrNodes in nodes)
    {
    }

あまりきれいではなく、あまり明白な方法ではありませんが、1 つのライナー:

foreach (var vrNodes in vrChildNodes.SelectNodes("//href") ?? Enumerable.Empty<nodeType>)
{
}

最初にやることを強くお勧めします。誰もが一目であなたの意図を理解できます。2番目のアプローチでは、最初に目的が何であるかを見て考える必要があります(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 に答える