2

以下に示すようなXMLがあります

<NodeName Foo="True" Foobar="False" />
<NodeName Foo="False" Foobar="False" />
<NodeName Foo="True" Foobar="False" />

これをクエリして、Foo 値が「True」の NodeName を見つけるために、次を使用しています。

.Where(node => node.Attribute("Foo").Value = "True");

ただし、属性 Foo が存在しない可能性があり、これにより例外が発生します。

問題は、属性が存在するかどうかを確認し、存在する場合は値を確認するロジックをどのように実装するかです。

私は次のことを試しましたが、現在、すべてのパスで値を返さないというエラーでコンパイルされないため、elseブラケットに何が入って何も返されないのかわかりません。

.Where(node =>
            {
                if (node.Attribute("Foo") != null)
                {
                    node.Attribute("Foo").Value == "True";
                }
                else { }
            });
4

3 に答える 3

9

ただし、属性 Foo が存在しない可能性があり、これにより例外が発生します。

XAttributeこれは、 (そして実際にはXElement) から文字列および他の多くの型への明示的な変換が役立つ場所です。

.Where(node => (string) node.Attribute("Foo") == "True");

そのような属性がない場合、変換は null を返します。これは、属性を 2 回 (プレゼンス用と値用に 1 回) 検索するよりもはるかに便利です。

または、属性が欠落している場合は null を返す変換を使用することもできるbool?ため、 null 合体演算子を使用してデフォルトを効果的に提供する必要があります。

.Where(node => (bool?) node.Attribute("Foo") ?? false);

編集:ステートメントラムダアプローチが機能しない理由に関しては、 return ステートメントがありません。これは機能しますが、明らかに私が推奨するものではありません。

.Where(node =>
        {
            if (node.Attribute("Foo") != null)
            {
                return node.Attribute("Foo").Value == "True";
            }
            else
            {
                return false;
            }
        });
于 2012-10-17T13:19:32.380 に答える
2

これを行うだけです

.Where(node => node.Attribute("Foo") == null ? false : node.Attribute("Foo").Value == "True"); 
于 2012-10-17T13:20:25.503 に答える
2

ラムダは、ノードが結果セットに含まれるかどうかを判断するためにブール値を返す必要があります。これを試して:

 xml.Where(node => node.Attribute("Foo") != null && node.Attribute("Foo").Value == "True");
于 2012-10-17T13:20:13.847 に答える