2

次のエラーが発生します:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>>' to 'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>'. An explicit conversion exists (are you missing a cast?) 

そして、私はその理由がわかりません。ここに、属性が次のものと同じDataContainerである要素を取得しようとする私のコードがあります。Namename.key

 XDocument xml = XDocument.Load(name.Value);
 IEnumerable<XElement> columns = from d in xml.Descendants("DataContainer")
                         where (d.Attribute("Name").Value.Equals(name.Key))
                         select d.Descendants("ArrayOfColumn");

そしてここに私のXMLファイルがあります:

<?xml version="1.0" encoding="utf-8"?>
<DataContainers>
    <DataContainer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="IRS vs E3M" Currency="EUR">
        <ArrayOfColumn Name="Maturite" isData="false">
            <Line Value="1Y" />
            <Line Value="2Y" />
            <Line Value="3Y" />
            <Line Value="4Y" />
            <Line Value="5Y" />
            <Line Value="6Y" />
            <Line Value="7Y" />
            <Line Value="8Y" />
            <Line Value="9Y" />
            <Line Value="10Y" />
            <Line Value="15Y" />
            <Line Value="20Y" />
            <Line Value="30Y" />
            <Line Value="40Y" />
            <Line Value="50Y" />
            <Line Value="60Y" />
        </ArrayOfColumn>
        <ArrayOfColumn Name="Value" isData="true">
            <Line Value="EURAB3E1Y" />
            <Line Value="EURAB3E2Y" />
            <Line Value="EURAB3E3Y" />
            <Line Value="EURAB3E4Y" />
            <Line Value="EURAB3E5Y" />
            <Line Value="EURAB3E6Y" />
            <Line Value="EURAB3E7Y" />
            <Line Value="EURAB3E8Y" />
            <Line Value="EURAB3E9Y" />
            <Line Value="EURAB3E10Y" />
            <Line Value="EURAB3E15Y" />
            <Line Value="EURAB3E20Y" />
            <Line Value="EURAB3E30Y" />
            <Line Value="EURAB3E40Y" />
            <Line Value="EURAB3E50Y" />
            <Line Value="EURAB6E60Y" />
        </ArrayOfColumn>
    </DataContainer>
</DataContainers>

誰かが私を助けて、なぜお願いしますか?

4

1 に答える 1

5

問題は、あなたdが子孫のコレクションであり、それらをフィルタリングし、フィルターを通過するものからさらに子孫を引き出すことです。

フィルターが 1 つの要素にのみ一致する場合でも、システムはそれをコレクションとして扱います。結果が 1 つしかないことがわかっている場合は.Single()、子孫を取得する前に d でメソッドを使用できます。たとえば、次のようになります。

XDocument xml = XDocument.Load(name.Value); 
IEnumerable<XElement> columns = xml.Descendants("DataContainer") 
                                   .Where(d => d.Attribute("Name").Value.Equals(name.Key)) 
                                   .Single()
                                   .Select(d => d.Descendants("ArrayOfColumn")); 

流れが良くなったので、メソッドチェーンに変更しました。where 式を単一のメソッドに入れることもできますが、こちらの方が見やすいことにも注意してください。

于 2012-06-11T10:38:20.123 に答える