【问题标题】:Linq - Cannot implicitly convert type 'IEnumerable<IEnumerable<.XElement>>' to 'IEnumerable<.XElement>'Linq - 无法将类型 'IEnumerable<IEnumerable<.XElement>>' 隐式转换为 'IEnumerable<.XElement>'
【发布时间】:2012-06-11 10:33:31
【问题描述】:

我收到以下错误:

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?) 

我不明白为什么。在这里,您有我的代码,我在其中尝试获取 Name 属性与 name.key 相同的 DataContainer 元素:

 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>

有人可以帮我解释一下为什么吗?

【问题讨论】:

    标签: c# linq c#-4.0 linq-to-xml


    【解决方案1】:

    问题在于您的d 是后代的集合,然后您将过滤它们并从通过过滤器的任何后代中提取更多后代。

    即使您的过滤器只匹配一个元素,系统仍会将其视为一个集合。如果知道结果只有一个,那么可以在拉出后代之前对d使用.Single()方法,例如:

    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 表达式放入单个方法中,但是这样看起来更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多